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()
}