准备工作:
先在项目根目录的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的视图类似:
{{ 变量名 }}