渲染模板 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。
我正在尝试使用 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。