gpt4 book ai didi

rust - 将模板渲染为 Rust 火箭中的字符串

转载 作者:行者123 更新时间:2023-12-04 12:58:39 26 4
gpt4 key购买 nike

我正在用 Rust Rocket 写一个小网站。我正在使用 Handlebars 模板,以及您返回 Template 的方式形成一个处理程序是相当方便的。但我也想将我的模板引擎用于我发送的电子邮件。问题是,rocket_contrib 中的模板不真正支持渲染到 String .

有一个方法 show() ,创建 Option<String> ,但不应该使用那个。

Render the template named name located at the path root with the context context into a String. This method is very slow and should not be used in any running Rocket application. This method should only be used during testing to validate Template responses. For other uses, use render instead.



方法 render() 是你通常使用的,但这个返回 Template ,这就是我开始的...你返回那些和火箭发挥它的魔力来产生结果的 html 页面。

有没有办法在火箭中使用我的模板来发送电子邮件?我的邮件 (lettre) 需要一个字符串。

最佳答案

使用 show() 完全没问题.这是how it's implementedRocket :

    pub fn show<S, C>(rocket: &Rocket, name: S, context: C) -> Option<String>
where S: Into<Cow<'static, str>>, C: Serialize
{
let ctxt = rocket.state::<ContextManager>().map(ContextManager::context).or_else(|| {
// N.B.: removed some logging for brevity
None
})?;

Template::render(name, context).finalize(&ctxt).ok().map(|v| v.0)
}
如您所见 show() 调用 render()在内部,就像 rustdoc 告诉我们的那样。但在这里它也调用 finalize() .我们查一下 what does it do :
/// Actually render this template given a template context. This method is
/// called by the `Template` `Responder` implementation as well as
/// `Template::show()`.
好的,所以 render()并没有真正渲染任何东西。它是 finalize()这就是在做这项工作。
我们也可以查询 how the Responder is implemented :
/// Returns a response with the Content-Type derived from the template's
/// extension and a fixed-size body containing the rendered template. If
/// rendering fails, an `Err` of `Status::InternalServerError` is returned.
impl Responder<'static> for Template {
fn respond_to(self, req: &Request) -> response::Result<'static> {
let ctxt = req.guard::<State<ContextManager>>().succeeded().ok_or_else(|| {
// N.B.: removed some logging for brevity
Status::InternalServerError
})?.inner().context();

let (render, content_type) = self.finalize(&ctxt)?;
Content(content_type, render).respond_to(req)
}
}
TL;博士:该文档似乎具有误导性。当您调用 show() 时,模板实现正在做完全相同的事情。以及当您发送回复时。在这两种情况下,它都会调用 finalize()在内部,产生 String模板的渲染。因此,使用 show() 不应该有任何性能损失。
PS: current main branch中的代码改变了一点,但逻辑还是一样的

关于rust - 将模板渲染为 Rust 火箭中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62366446/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com