为什么 Tera 在渲染模板时会说 TemplateNotFound?

问题描述

我正在尝试使用 tera 在 Rust 中构建一个网络应用程序,每次在下面的 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. 认工具链从稳定 -> 货物构建/运行切换到每晚 -> 货物构建/运行并返回。
  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"),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",&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
}

解决方法

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