域名 AXUM.RS 将于2025年10月到期。我们无意再对其进行续费,我们希望你能够接续这个域名,让更多 AXUM 开发者继续受益。现在,我们已启用新域名 AXUM.EU.ORG
  • 方案AXUM.RS 域名 = 3000
如果你有意接续这份 AXUM 情怀,请与我们取得联系。
说明:
  1. 如果有人购买 AXUM.RS 域名,或者该域名到期,本站将使用免费域名 AXUM.EU.ORG 继续提供服务。

将HTML模板嵌入到AXUM应用

本章我们讨论如何将HTML模板嵌入到AXUM应用的二进制文件中。

目标

我们的目标是,实现一个AXUM应用,获取服务器当前时间,并通过RUST渲染的HTML模板中。

依赖

[dependencies]
tokio = { version = "1", features = ["full"] }
axum = { version = "0.7" }
serde = { version = "1", features = ["derive"] }
chrono = { version = "0.4", features = ["serde"] }
rust-embed = "8.5"
askama = "0.12"

Rust代码

// src/main.rs

use askama::Template;
use axum::{response::Html, routing::get, Router};
use chrono::Local;
use rust_embed::Embed;

#[derive(Embed)]
#[folder = "templates/"]
struct Asset;

#[derive(Template)]
#[template(path = "index.html")]
struct IndexTemplate {
    now: String,
}

#[tokio::main]
async fn main() {
    let tcp_listener = tokio::net::TcpListener::bind("0.0.0.0:9527").await.unwrap();
    let app = Router::new().route("/", get(index_handler));
    axum::serve(tcp_listener, app).await.unwrap();
}

async fn index_handler() -> Html<String> {
    let tmp = IndexTemplate {
        now: Local::now().format("%Y-%m-%d %H:%M:%S").to_string(),
    };
    Html(tmp.render().unwrap())
}

声明需要嵌入二进制文件中的资源目录

#[derive(Embed)]
#[folder = "templates/"]
struct Asset;

定义模板结构

#[derive(Template)]
#[template(path = "index.html")]
struct IndexTemplate {
    now: String,
}
  • #[template(path = "index.html")]:指定模板文件是 index.html。默认情况下,askama会自动在 templates 目录里寻找该文件
  • now: String:当前服务器时间

主函数

#[tokio::main]
async fn main() {
    let tcp_listener = tokio::net::TcpListener::bind("0.0.0.0:9527").await.unwrap();
    let app = Router::new().route("/", get(index_handler));
    axum::serve(tcp_listener, app).await.unwrap();
}

没什么好说的。

首页

async fn index_handler() -> Html<String> {
    let tmp = IndexTemplate {
        now: Local::now().format("%Y-%m-%d %H:%M:%S").to_string(),
    };
    Html(tmp.render().unwrap())
}

模板文件

部署

本章代码位于html-template目录

要查看完整内容,请先登录