私はラケットWebサーバを使用して少しのブログを書いています(web-server/templates, web-server/servlet-env, web-server/servlet, web-server/dispatch
が必要です)。少し手順を定義ラケットWebサーバ/テンプレートインクルードテンプレートは変数に使用できません
(define (render-homeworks-overview-page)
(let
([dates
(sort
(get-all-homework-dates)
#:key my-date->string
string<?)])
(include-template "templates/homework-overview.html")))
、その後、テンプレート内で使用されているこの場合dates
で、必要なすべての値を使用して、テンプレートを提供するために:私はテンプレートをレンダリングしたいときはいつでも、私は何か、これを行います。これまでのところうまくいきましたが、すべてのレンダリングプロシージャでを取り除くことができると考えました。これは、より抽象的な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 /"
のようなものを含めて何かにダメージを与える可能性があります。私にとっては、Webサーバーはファイルが存在する場合にはをチェックしてください。その名前のです。明らかにそれは存在しないので、エラーを投げる。これがどのようにして望ましくない損害をもたらしますか?結果として、文字列へのテンプレートへのパスとして使用できるものを制限する背後にある理由を理解していません(回避策を除く)。しかし、これはあまりにも多くの1つの質問のためかもしれないし、多分物事の "理由"についての別の質問に入れなければならない。
題したドキュメントのセクション[私は「動的 "テンプレートを使用するにはどうすればよい?](http://docs.racket-lang.org/web-server/faq.html#%28part ._。How_do_.I_use_templates__dynamically __%29)はあなたの質問に対処します。 –