現(xiàn)在的大部分web項目都是前后端分離的铭段,但是霎箍,對于一個后端開發(fā)來說祈匙,額外去學(xué)習(xí)vue,react等前端框架還是需要投入不少的時間吐限,雖然說多學(xué)點總沒壞處鲜侥,但是對于僅有幾個頁面的簡單項目(比如本教程的個人博客系統(tǒng)),還是更推薦使用語言自帶的模板引擎诸典;
選擇模板引擎
crates.io
上來看描函,template-engine
分類下,下載量較多的有
- tinytemplate
- handlebars
- tera
- askama
筆者最先接觸的是askama
, 使用下來也比較接近其他語言的模板引擎狐粱,所以本教程就使用askama
作為示例舀寓;
創(chuàng)建第一個模板并發(fā)布
- 添加項目依賴
...
[dependencies.askama]
version = "0.12.1"
features = ["with-axum"]
[dependencies.askama_axum]
version = "0.4.0"
...
- 創(chuàng)建第一個模板
1). askama讀取模板文件的根路徑默認為根目錄下的
templates
目錄(可通過配置文件配置,在此我們使用默認配置)肌蜻,
2). 模板路徑為templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
Hello,{{name}}
</body>
</html>
-
在rust中導(dǎo)入模板
... use askama_axum::Template; #[derive(Template,Debug)] #[template(path="index.html")] struct IndexTemplate{ name:String, } ...
將模板通過axum路由返回并渲染到頁面
...
// 創(chuàng)建路由handler
async fn index() -> Html<String> {
let index = IndexTemplate {
name: "World".to_string(),
};
let s = index.render().unwrap().into();
s
}
...
完整代碼:
use askama_axum::Template;
use axum::{response::Html, routing::get, Router};
#[derive(Debug, Template)]
#[template(path = "index.html")]
pub struct IndexTemplate {
name: String,
}
#[tokio::main]
async fn main() {
let app = Router::new().route("/", get(index));
let tcp_listener = tokio::net::TcpListener::bind("127.0.0.1:3000")
.await
.unwrap();
axum::serve(tcp_listener, app).await.expect("啟動失敗");
}
async fn index() -> Html<String> {
let index = IndexTemplate {
name: "World".to_string(),
};
let s = index.render().unwrap().into();
s
}
瀏覽器訪問http://localhost:3000
可看到 Hello,World