我正在寫一個使用球拍網絡服務器(需要web-server/templates, web-server/servlet-env, web-server/servlet, web-server/dispatch
)的博客。每當我想呈現一個模板,我做一些這樣的:球拍網絡服務器/模板包含模板不能用於變量
(define (render-homeworks-overview-page)
(let
([dates
(sort
(get-all-homework-dates)
#:key my-date->string
string<?)])
(include-template "templates/homework-overview.html")))
定義一個小程序,提供模板與所有必要的值,在這種情況下dates
,然後在模板中使用。到目前爲止,這樣做的效果很好,但我想也許我可以在所有渲染過程中擺脫let
,將其放入更抽象的render-template
過程中,然後由所有渲染過程調用該過程。另外,對這個更抽象的過程的調用可能變得如此簡單,以至於我不再需要所有的小渲染過程。我想作爲關鍵字參數提供的值,到目前爲止,我得到了下面的代碼:
(define render-template
(make-keyword-procedure
(lambda
(keywords keyword-args [content "<p>no content!</p>"] [template-path "template/base.html"])
(let
([content content])
(include-template template-path)))))
這對在模板中顯示的內容和默認值模板中的默認路徑來呈現,並採取武斷關鍵字參數,以便任何渲染過程可以通過將模板作爲關鍵字提供給模板,從而提供所需的任何內容。
但是,我不能運行這段代碼,因爲有一個錯誤:
include-at/relative-to/reader: not a pathname string, `file' form, or `lib' form for file
呼叫(include-template template-path)
的template-path
是紅色下劃線,表示該錯誤是存在的。然而,當我與一個普通的字符串替換template-path
像這樣:
(define render-template
(make-keyword-procedure
(lambda
(keywords keyword-args [content "<p>no content!</p>"] [template-path "template/base.html"])
(let
([content content])
(include-template "templates/base.html")))))
不會發生錯誤。似乎球拍以某種方式要確保,有一個有效的路徑include-template
。但我希望這是對該程序的價值。否則,我不能寫一個做這個工作的程序。
另外我希望提供給過程的關鍵字的值對模板可見。我不確定,如果是這種情況,或者我需要在include-template
調用周圍加上某種let
,因爲我無法獲得代碼以便運行,以便對其進行測試。
我該怎麼寫這樣的程序?
,因爲我想有一個理想的過程的例子:
- 的Jinja2的
render_template
我能提供任何關鍵字參數我想和渲染我希望呈現的任何模板。我也不太明白,爲什麼包括像"rm -rf /"
這樣的東西可能會損壞任何東西。對我來說,似乎網絡服務器應該簡單地檢查如果文件存在與該名稱。顯然它不會存在,所以拋出一個錯誤。這應該如何導致任何不必要的損害?因此,我不理解限制什麼可以用作模板路徑到字符串(除了解決方法)之外的原因。然而,對於一個SO問題來說,這可能太過分了,應該對另一個關於「爲什麼」的問題進行討論。
標題文檔中的部分[如何使用模板「動態「?](http://docs.racket-lang.org/web-server/faq.html#%28part ._。How_do_.I_use_templates__dynamically __%29)解決您的問題。 –