Rustでかんたん動的サイト構築

いろんなライブラリを触りたい。ナナオです。 今回はPythonのHTMLテンプレートエンジンで有名なJinjaに影響を受けたTeraを使って、簡単な動的サイトを作ってみたいと思います。 プロジェクトの作成 とりあえず実験用のプロジェクトを作成します。 cargo new rust-ssr-playground 必要なライブラリをインストールしてあげます。 今回はWebサーバーとしてAxum、HTMLのテンプレートエンジンとしてTeraを使用します。 [dependencies] axum = "0.7.1" serde = { version = "1.0.193", features = ["derive"] } tera = "1.19.1" tokio = { version = "1.34.0", features = ["full"] } じゃあとりあえずaxumを起動できるところまで実装します。 use axum::{Router, routing::get}; #[tokio::main] async fn main() { let app = Router::new().route("/", get(|| async { "hello world" })); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); axum::serve(listener, app).await.unwrap(); } 起動してアクセスしてみましょう。 ちゃんと起動しましたね。 次にプロジェクトにHTMLを追加してみましょう。 templatesというディレクトリを作成して、その中にindex.htmlを作成しましょう。 作成したHTMLは以下の通りです。 (Teraのテンプレート構文についてはこちらを参照してください) hello {{ name }}! nameの部分はTeraで入れるようにしました。 HTMLの準備ができたので、これをTeraで描画できるようにします。 use axum::{Router, response::Html, routing::get}; use tera::{Context, Tera}; use serde::Serialize; #[derive(Serialize)] struct Index { name: String } #[tokio::main] async fn main() { let tera = match Tera::new("templates/**/*.html") { Ok(t) => t, Err(e) => { println!("Parsing error(s): {}", e); ::std::process::exit(1); } }; let index = Index { name: String::from("test") }; let page = tera.render("index.html", &Context::from_serialize(&index).unwrap()).unwrap(); let app = Router::new().route("/", get(|| async move { Html(page.to_owned()) })); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); axum::serve(listener, app).await.unwrap(); } できました。nameにはtestと描画できるようにします。 ...

11月 27, 2023 · にあえん