渲染模板 Rust Rocket Handlebars

Render Template Rust Rocket Handlebars

我正在尝试使用 rust rocket 和 handlebars 渲染模板,这工作正常,但我无法使 html 文件的任何参数起作用,页面加载,但参数不存在.我对 python 的 flask 和 jinja 很熟悉,但对 rocket 和 handlebars 不是很熟悉。我尝试了无数种方法,但找不到任何有效的文档。

main.rs

#![feature(decl_macro)]

extern crate rocket;
extern crate rocket_contrib;

use rocket::{get, routes};
use rocket_contrib::templates::Template;


#[get("/one")]
fn one() -> String {
    format!("One")
}


#[get("/page")]
fn page() -> Template {
    let context = "string";
    Template::render("page", &context)
}


fn main() {
    rocket::ignite()
        .mount("/", routes![one])
        .attach(Template::fairing())
        .launch();
}

page.html.hbs

<!DOCTYPE html>

<head></head>

<html>
    <body>
        <h1>Argument is: {{context}}</h1>
    </body>
</html>

模板系统不知道局部变量被调用context。它只知道您的上下文是一个字符串,它没有名为 context 的属性。您需要提供一个实现 Serialize 的类型,其中一个名为 context 的成员用于模板表达式 {{context}} 以扩展到任何内容。您可以使用 HashMap 或自定义类型来执行此操作。

HashMap:

#[get("/page")]
fn page() -> Template {
    let mut context = HashMap::new();
    context.insert("context", "string");
    Template::render("page", &context)
}

使用自定义类型:

#[get("/page")]
fn page() -> Template {
    #[derive(serde_derive::Serialize)]
    struct PageContext {
        pub context: String,
    }

    let context = PageContext { context: "string" };
    Template::render("page", &context)
}

自定义类型通常会表现更好,并且 self-documenting。