首页 > 解决方案 > 为什么 Tera 在渲染模板时会显示 TemplateNotFound?

问题描述

我正在尝试使用 Tera 在 Rust 中构建一个 Web 应用程序,并且每次在render()下面的调用中都会出现恐慌。代码块示例:

async fn login(tera: web::Data<Tera>) -> impl Responder {
    let mut data = Context::new();
    data.insert("title", "Login");

    let rendered = tera.render("login.html", &data).unwrap();
    HttpResponse::Ok().body(rendered)
}

链接到我的回购审查:https ://github.com/ClusterberrySquirrels/oasis/blob/oasis_db/src/main.rs

我收到以下恐慌电话:

thread 'actix-rt:worker:0' panicked at 'called `Result::unwrap()` on an `Err` value: Error { kind: TemplateNotFound("login.html"), source: None }', src/main.rs:101:53

index.html当我在页面上的这个项目开始时遇到同样的问题时,有些东西解决了这个恐慌。起初我认为是 Tera 导致了这个问题,但我没有找到任何修复它的步骤。最终,我所做的事情使它按预期运行,直到现在一切都很好。我将不胜感激有关如何解决此问题并避免将来发生此问题的任何建议。

文件结构:

Project Folder\
  templates\
    login.html
    index.html
  src\
    main.rs

我这边的故障排除不一定按顺序:

  1. 将工具链默认从 stable -> cargo build/run 切换到 nightly -> cargo build/run 并返回。
  2. 生锈更新
  3. sudo apt 更新
  4. sudo apt升级
  5. wsl --set-default-version 2
  6. 货物清洁
  7. 删除目标文件夹然后 cargo clean、cargo build、cargo run
  8. 货物更新

更新问题:最小可重现示例。

use actix_web::{HttpServer, App, web, HttpResponse, Responder};
use tera::{Tera, Context};

async fn index(tera: web::Data<Tera>) -> impl Responder {
    let mut data = Context::new();

    let posts = [
        Post {
            title: String::from("This is the first link"),
            link: String::from("https://example.com"),
            author: String::from("Nutrition-Tracker"),
        },
        Post {
            title: String::from("This is the second Link"),
            link: String::from("https://example.com"),
            author: String::from("Other cool app"),
        },
    ];

    data.insert("title", "index");
    data.insert("posts", &posts);

    let rendered = tera.render("index.html", &data).unwrap(); // TemplateNotFound??
    HttpResponse::Ok().body(rendered)
}

async fn login(tera: web::Data<Tera>) -> impl Responder {
    let mut data = Context::new();
    data.insert("title", "Login");

    let rendered = tera.render("login.html", &data).unwrap(); // TemplateNotFound??
    HttpResponse::Ok().body(rendered)
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        let tera = Tera::new("templates/**/*").unwrap(); 
        App::new()
            .data(tera)
            .route("/", web::get().to(index))
            .route("/login", web::get().to(login))
    })
        .bind("127.0.0.1:8000")?
        .run()
        .await
}

标签: linuxrusttera

解决方案


我弄清楚了这个问题。我也在为这个应用程序运行 kubernetes,我选择的端口被 kubernetes 随机占用。我杀死了所有进程,但是问题仍然存在,这是另一个线程的问题。


推荐阅读