利用 FastAPI 和 Jinja2 模板引擎快速构建 Web 应用

FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,它基于标准 Python 类型提示。FastAPI 支持异步编程,使得开发高性能的 Web 应用变得简单快捷。在本文中,我们将探讨如何使用 FastAPI 结合 Jinja2 模板引擎来创建动态 Web 应用。

Jinja2 模板引擎

Jinja2 是一个非常流行的模板引擎,它可以让你用变量替代模板中的占位符,生成动态的 HTML 页面。它被广泛用于 Web 应用中,以生成用户界面。

安装依赖

在开始之前,确保你已经创建并激活了一个虚拟环境,然后安装 Jinja2:

复制代码
pip install jinja2

使用 Jinja2Templates

FastAPI 允许你使用任何模板引擎,但 Jinja2 是一个常见的选择。以下是如何在 FastAPI 应用中集成 Jinja2 的步骤:

  1. 导入 Jinja2Templates

    复制代码
    from fastapi import FastAPI, Request
    from fastapi.responses import HTMLResponse
    from fastapi.staticfiles import StaticFiles
    from fastapi.templating import Jinja2Templates
  2. 创建 templates 对象

    复制代码
    app = FastAPI()
    app.mount("/static", StaticFiles(directory="static"), name="static")
    templates = Jinja2Templates(directory="templates")
  3. 定义路由和视图函数

    复制代码
    @app.get("/items/{id}", response_class=HTMLResponse)
    async def read_item(request: Request, id: str):
        return templates.TemplateResponse(request=request, name="item.html", context={"id": id})

    在这里,我们定义了一个路由 /items/{id},它将返回一个使用 item.html 模板渲染的 HTML 响应。

编写模板

你可以在 templates/item.html 文件中编写你的模板,例如:

复制代码
<html>
<head>
    <title>Item Details</title>
    <link href="{{ url_for('static', path='/styles.css') }}" rel="stylesheet">
</head>
<body>
    <h1><a href="{{ url_for('read_item', id=id) }}">Item ID: {{ id }}</a></h1>
</body>
</html>

在这个模板中,我们使用了 url_for 函数来生成静态文件和动态链接的 URL。

模板上下文值

在模板中,你可以使用传递给 TemplateResponse 的上下文字典中的值。例如,{``{ id }} 将显示从上下文中获取的 id 值。

模板和静态文件

你可以使用 url_for 函数来引用静态文件,如 CSS、JavaScript 或图片。这使得在模板中引用这些资源变得简单。

Demo 1: 基础的 Jinja2 模板使用

在这个示例中,我们将创建一个简单的 FastAPI 应用,它使用 Jinja2 模板引擎来渲染一个欢迎页面。

步骤 1: 安装依赖

首先,确保你已经安装了 FastAPI 和 Jinja2:

复制代码
pip install fastapi[jinja2]
步骤 2: 创建 FastAPI 应用

创建一个名为 main.py 的文件,并添加以下代码:

复制代码
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates

app = FastAPI()
templates = Jinja2Templates(directory="templates")

@app.get("/", response_class=HTMLResponse)
async def read_root(request: Request):
    return templates.TemplateResponse(request=request, name="welcome.html", context={"name": "World"})
步骤 3: 创建 Jinja2 模板

在项目目录中创建一个名为 templates 的文件夹,并在其中创建一个名为 welcome.html 的文件,添加以下 HTML 代码:

复制代码
<html>
<head>
    <title>Welcome</title>
</head>
<body>
    <h1>Welcome, {{ name }}!</h1>
</body>
</html>
说明

这个示例中,我们定义了一个路由 /,它使用 welcome.html 模板渲染一个欢迎页面。name 变量从上下文中传递给模板,用于显示欢迎信息。

Demo 2: 使用模板和静态文件

这个示例展示了如何在 FastAPI 应用中使用 Jinja2 模板和静态文件(如 CSS)。

步骤 1: 安装依赖

确保你已经安装了 FastAPI 和 Jinja2:

复制代码
pip install fastapi[jinja2]
步骤 2: 创建 FastAPI 应用

创建一个名为 main.py 的文件,并添加以下代码:

复制代码
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates

app = FastAPI()
app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates")

@app.get("/", response_class=HTMLResponse)
async def read_root(request: Request):
    return templates.TemplateResponse(request=request, name="home.html", context={"title": "Home Page"})
步骤 3: 创建 Jinja2 模板

templates 文件夹中创建一个名为 home.html 的文件,添加以下 HTML 代码:

复制代码
<html>
<head>
    <title>{{ title }}</title>
    <link href="{{ url_for('static', path='/style.css') }}" rel="stylesheet">
</head>
<body>
    <h1>{{ title }}</h1>
    <p>This is a demo page with static CSS.</p>
</body>
</html>
步骤 4: 添加静态 CSS 文件

在项目目录中创建一个名为 static 的文件夹,并在其中创建一个名为 style.css 的文件,添加以下 CSS 代码:

复制代码
h1 {
    color: blue;
}
说明

在这个示例中,我们定义了一个路由 /,它使用 home.html 模板渲染一个页面,该页面引用了一个静态 CSS 文件。title 变量从上下文中传递给模板,用于设置页面标题。通过 url_for('static', path='/style.css'),我们能够正确地引用静态文件,使得页面的 h1 标签文字颜色变为蓝色。

这两个示例展示了如何在 FastAPI 应用中使用 Jinja2 模板引擎来渲染动态内容和静态资源,从而创建更加丰富和交互式的 Web 应用。

相关推荐
爱喝白开水a6 分钟前
前端AI自动化测试:brower-use调研让大模型帮你做网页交互与测试
前端·人工智能·大模型·prompt·交互·agent·rag
董世昌417 分钟前
深度解析ES6 Set与Map:相同点、核心差异及实战选型
前端·javascript·es6
B站_计算机毕业设计之家21 分钟前
豆瓣电影数据采集分析推荐系统 | Python Vue Flask框架 LSTM Echarts多技术融合开发 毕业设计源码 计算机
vue.js·python·机器学习·flask·echarts·lstm·推荐算法
渣渣苏28 分钟前
Langchain实战快速入门
人工智能·python·langchain
lili-felicity37 分钟前
CANN模型量化详解:从FP32到INT8的精度与性能平衡
人工智能·python
数据知道40 分钟前
PostgreSQL实战:详解如何用Python优雅地从PG中存取处理JSON
python·postgresql·json
ZH15455891311 小时前
Flutter for OpenHarmony Python学习助手实战:面向对象编程实战的实现
python·学习·flutter
玄同7651 小时前
SQLite + LLM:大模型应用落地的轻量级数据存储方案
jvm·数据库·人工智能·python·语言模型·sqlite·知识图谱
User_芊芊君子1 小时前
CANN010:PyASC Python编程接口—简化AI算子开发的Python框架
开发语言·人工智能·python
白日做梦Q1 小时前
Anchor-free检测器全解析:CenterNet vs FCOS
python·深度学习·神经网络·目标检测·机器学习