準備工作:
先在項目根目錄的Cargo.toml文档中添加依賴記錄
[dependencies.askama] version = "0.11.1"
注意, 你的項目裡面有src文档夾, 也應該在同級別新建一個名叫templates的文档夾, 用以放置.html視圖。
在main.rs或者隨便找個加載公共方法的文档引入一個公共結構體:
struct HtmlTemplate<T>(T); impl<T> IntoResponse for HtmlTemplate<T> where T: Template, { fn into_response(self) -> Response { match self.0.render() { Ok(html) => Html(html).into_response(), Err(err) => ( StatusCode::INTERNAL_SERVER_ERROR, format!("渲染視圖失敗: {}", err), ) .into_response(), } } }
準備工作完成...
如何擺放視圖變量和使用視圖
在項目中找一個控制器文档,如果你的項目壓根沒有mvc的概念, 哪怕就一個main.rs, 也沒關係, 定義一個結構體, 代碼如下。
#[derive(Template)] #[template(path = "somepage.html")] struct TplSomepage { title: String, description: String, company_name: String, }
根據編譯器的提示, 結構體的命名寫法有點要求, 不然報bug, 鄙人在這裡命名爲TplXxxXxx
那麽在項目根目錄下的templates文档夾底下你需要新建一個文档叫somepage.html, 就和上方的結構體關聯上了。
接下來,在控制器裡寫一個方法(請原諒我mvc寫慣了, 寫rust也這個鳥味兒):
pub async fn hey_shit() -> impl IntoResponse { let title = String::from("標題"); let description = String::from("描述"); let company_name = String::from("某某公司"); let template = TplSomepage { title, description, company_name, }; HtmlTemplate(template) }
至於視圖變量的放置, 和之前處理python/php的視圖類似:
{{ 變量名 }}