#tera #actix-web #reduce-boilerplate #web

actix_tera_page

Actix 的中间件,用于减少使用 Tera 创建 SSR 网站所需的样板代码

1 个不稳定版本

0.1.0 2023年10月12日

#15 in #reduce-boilerplate

MIT 许可协议

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