HTMLレスポンス
このページではテンプレートエンジン askama を利用して、データを埋め込んだHTMLをレスポンスできるようにします。
テンプレートエンジン
テンプレートエンジンを使うことで、テンプレートとなるHTMLをベースに、条件による表示/非表示の切り替えや配列データをループして表示させることができます。表示制御の書き方については テンプレート記法 を確認してください。
askamaではデフォルトで templates/
ディレクトリ配下のHTMLファイルをテンプレートと認識します。(コンフィギュレーションで変更可能です)
今回は、他のテンプレートから利用されるテンプレートも含め、3つ作成しています。
構造体の実装
テンプレートをプログラムから扱えるようにするためには、テンプレートに対応する構造体を作成する必要があります。
templates/hoge.html
にベースをする場合、下記のような構造体を用意します。
templates/hoge.html
<html>
<body>
{{hoge_hoge}}
</body>
</html>
src/hoge.rs
use askama::Template;
#[derive(Template)] // Templateトレイトを実装
#[template(path = "hoge.html")] // template(path)でHTMLファイルを指定
struct Hoge {
hoge_hoge: String,
}
#[template(...)]
に指定できる属性については、 The template() attribute を確認してください。
IntoResponseへの変換
Template
をderiveした構造体を用意したので、 render()
を呼び出せるようになります。呼び出すことで構造体のフィールドのデータが埋め込まれたHTML文字列を Result<String, Error>
型で取得することができます。
fn handler() -> impl IntoResponse {
let hoge = Hoge { "こんにちは".to_string() };
let html = hoge.render().unwrap();
Html(html).into_response()
}