1 个不稳定版本
0.1.0 | 2023年10月12日 |
---|
#15 in #reduce-boilerplate
16KB
119 行
actix_tera_page
此软件包为 actix_web
提供中间件,用于减少使用 Tera
创建 SSR 网站所需的样板代码。它将 GET 请求路径与模板匹配,并使用共享的“基础上下文”渲染它们。一个示例用例可能是在网站导航栏中填充用户信息或登录/注册按钮,具体取决于是否有用户登录。
lib.rs
:
此软件包为 actix_web
提供中间件,用于减少使用 Tera
创建 SSR 网站所需的样板代码。它将 GET 请求路径与模板匹配,并使用共享的“基础上下文”渲染它们。一个示例用例可能是在网站导航栏中填充用户信息或登录/注册按钮,具体取决于是否有用户登录。
要开始使用,创建一个接受 HttpResponse
并返回 Context
的异步函数。在 Web 服务器上将 Tera
对象注册为应用数据,然后使用 TeraPage::new
构造的中间件包装应用程序或路由。
struct State {
name: String,
}
async fn base_context(req: HttpRequest) -> Context {
let state = req.app_data::<Data<State>>().unwrap();
let mut context = Context::new();
// This function could, for example, make SQL queries
// through a connection stored in `State`.
context.insert("username", &state.name);
context
}
#[get("/complex-page")]
async fn complex_page(tera: web::Data<Tera>, req: HttpRequest) -> impl Responder {
// The `base_context` function can be reused as a starting point
// for pages with more complex requirements.
let mut context = base_context(req.clone());
context.insert("more-info", "data");
tera.render("complex-page.html", &context).unwrap()
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let state = web::Data::new(State {
name: "User Name".to_string(),
});
let tera = web::Data::new(match Tera::new("templates/**/*.html") {
Ok(t) => t,
Err(e) => {
println!("Parsing error(s): {}", e);
::std::process::exit(1);
}
});
HttpServer::new(move || {
App::new()
.app_data(state.clone())
.app_data(tera.clone())
.service(complex_page)
.wrap(TeraPage::new("pages", base_context))
})
.bind(("127.0.0.1", 8080))?
.run()
.await
}
功能示例可以在 examples
目录中找到。
依赖关系
~21–32MB
~581K SLoC