六 Rust Web入门:服务器端web应用( 二 )


use actix_web::web;use crate::handlers::*;use actix_files as fs;pub fn app_config(cfg: &mut web::ServiceConfig) {cfg.service(web::scope("").service(fs::Files::new("/static","./static").show_files_listing()).service(web::resource("/").route(web::get().to(get_all_teacher))).service(web::resource("/register").route(web::get().to(show_register_from))).service(web::resource("/register-post").route(web::post().to(handle_register))));}
模板引擎的使用
现在我们来依次编写里的处理函数
首先是默认路由的展示教师数据,首先我们使用这个包来调用我们之前编写的接口,测试的时候,我们要将之前编写的完整的增删改查的接口 api 项目在 3077 端口启动起来:
pub async fn get_all_teacher(tmpl: web::Data) -> Result {let awc_client = awc::Client::default();let res = awc_client.get("http://localhost:3077/teachers/").send().await.unwrap().json::().await.unwrap();}
在获取数据之后我们把它添加到我们的模板里,我们开启一个 ctx 上下文,在其中插入和两个数据,之后我们将 .html 作为我们的模板,把上下文插入到这个模板中,现在这个模板就可以使用这两个变量了,通过模板引擎选然后会返回将模板的插值语句变为插入数据的网页代码,将它封装返回,用户就能看到完整的页面了:
pub async fn get_all_teacher(tmpl: web::Data) -> Result {let awc_client = awc::Client::default();let res = awc_client.get("http://localhost:3077/teachers/").send().await.unwrap().json::().await.unwrap();let mut ctx = tera::Context::new();ctx.insert("error", "");ctx.insert("teachers", &res);let s = tmpl.render("teachers.html", &ctx).map_err(|_| MyError::TeraError("Template error".to_string()))?;Ok(HttpResponse::Ok().content_type("text/html").body(s))}
如下是编写好的模板,因为这个内容不是本教程最关键介绍的编写页面的方案,所以这里就简单给出 demo,如果想要了解模板的更多编写方法可以自行查阅资料:
Teachers教师列表

    {% for t in teachers %}
  1. {{t.name}}
    {{t.profile}}
  2. {% endfor %}

同样我们将我们的界面也写好,因为初始值都是空的,所以我们给与的上下文信息都是空的:
pub async fn show_register_from(tmpl: web::Data) -> Result {let mut ctx = tera::Context::new();ctx.insert("error", "");ctx.insert("current_name", "");ctx.insert("current_imageurl", "");ctx.insert("current_profile", "");let s = tmpl.render("register.html", &ctx).map_err(|_| MyError::TeraError("Template error".to_string()))?;Ok(HttpResponse::Ok().content_type("text/html").body(s))}
这是.html 的页面:
register注册老师