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

news2024/11/15 10:39:30

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 应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2139692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单线程与2个线程的简易理解

前言 有个需要10个步骤完成的任务&#xff0c;假设每个步骤需要1秒 单线程耗费10秒完成任务 2根线程可能耗费6秒&#xff0c;也可能更少 单线程程序 单线程下&#xff0c;步骤按照次序顺序执行&#xff0c;共计耗费10秒 2个线程的程序 有步骤可以在同一时刻同时运行&…

Python酷库之旅-第三方库Pandas(117)

目录 一、用法精讲 516、pandas.DataFrame.add_suffix方法 516-1、语法 516-2、参数 516-3、功能 516-4、返回值 516-5、说明 516-6、用法 516-6-1、数据准备 516-6-2、代码示例 516-6-3、结果输出 517、pandas.DataFrame.align方法 517-1、语法 517-2、参数 51…

Linux操作系统如何添加新字体

在一个Linux操作系统及办公软件刚安装后&#xff0c;会发现缺少常用的“楷体_GB2312”和“仿宋_GB2312”字体。此时&#xff0c;只需要从其它电脑复制到或者从互联网上下载到这两个字体文件&#xff0c;然后导入到自己的电脑即可&#xff0c;再次打开办公软件就会看到这个字体已…

Playwright 与 Selenium对比

通过这篇关于 Playwright 与 Selenium 的文章&#xff0c;我们将更容易理解 Playwright 和 Selenium 之间的关键区别&#xff0c;并找出哪个工具可能更适合您的需求。 在自动化测试工具方面&#xff0c;Playwright 和 Selenium 都是软件测试人员使用的强大的 Web 自动化工具。它…

PointNet++改进策略 :模块改进 | EdgeConv | DGCNN, 动态图卷积在3d任务上应用

目录 介绍核心思想及其实现核心思想实现步骤 如何改进PointNet**局部几何结构的处理****动态图的引入****特征聚合的灵活性****全局和局部特征的结合** 论文题目&#xff1a;Dynamic Graph CNN for Learning on Point Clouds发布期刊&#xff1a;TOG作者单位&#xff1a;麻省理…

基于JDK1.8和Maven的GeoTools 28.X源码自主构建实践

目录 前言 一、GeoTools与Jdk的版本关系 1、GeoTools与Jdk版本 2、编译环境简介 二、使用Maven编译GeoTools28.X 1、GeoTools28.x 2、Maven的完整编译 3、构建时的问题 三、总结 前言 想要学习和掌握一个开源软件或者项目&#xff0c;源码是我们主要学习的内容。学习开…

NeurIPS 2023 | 基于 Llama 的单变量时序预测基础模型

概率时间序列预测是在广泛应用中出现的一个重要实际问题&#xff0c;包括金融、天气预报、脑成像和计算机系统性能管理等领域。针对这一任务&#xff0c;已经提出了各种方法&#xff0c;从传统的自回归模型到最近基于深度学习架构的神经预测方法。这些以前的方法大多集中在用来…

八、动态规划-算法总结

文章目录 八、动态规划8.1 背景8.1.1 DFS8.1.2 DFS的优化8.1.3 从DFS到动态规划 8.2 使用场景8.3 四点要素 常见四种类型8.4 矩阵类型8.4.1 最小路径和8.4.2 不同路径8.4.3 不同路径 II 8.5 序列类型8.5.1 爬楼梯8.5.2 最长递增子序列8.5.3 单词拆分小结 8.6 双序列类型8.6.1 最…

匹配行最大值替换为最小值公式

好的!我们一步一步详细讲解这个公式的作用和如何实现你想要的功能。 ### 数据结构假设: - 你的数据在 A、B、C 列中,每一行都有值。 - 需要在 A 列和 B 列相同的行中,找到 C 列中的最大值,将其替换为最小值,其他值保持不变。 ### 公式: ```excel =IF(C2=MAX(IF(($A$2:$…

借老系统重构我准备写个OpenAPI3.1版的API管理工具(附录屏演示)

前段时间一直在忙公司老系统重构的方案设计&#xff0c;其中最大的重构点就是前后端分离。为了加快前后端协同开发和对接的工作效率&#xff0c;我决定写一个公司内部使用的OpenAPI3.1版的API管理工具。 文章目录 有现成的工具为啥不用现有成熟方案初步成果展示录屏演示下一步计…

调制是什么,为什么

一、什么是调制、解调&#xff1f; 调制&#xff1a;将信息承载到满足信道要求的高频信号上的过程就是调制。 解调&#xff1a;解调是调制的逆过程&#xff0c;将有用的信息从高频信号中恢复出来的过程就是解调。 二、为什么需要调制&#xff1f; 通信是为了实现“信息”的传…

[240916] X-CMD 发布 v0.4.11:新增 mac 模块,集成 MacOS 实用功能 | 新增 OpenAI o1 系列模型的支持

目录 X-CMD 发布 v0.4.11&#x1f4c3;Changelog✨ mac - 集成 MacOS 实用功能✨ openai✨ gh✨ jina✅ 升级指南 X-CMD 发布 v0.4.11 &#x1f4c3;Changelog ✨ mac - 集成 MacOS 实用功能 新增 mac 模块&#xff0c;用于集成 MacOS 用户需要的各种实用功能&#xff0c;以…

LabVIEW机械手视觉引导系统

开发了LabVIEW软件和硬件工具开发的高精度机械手视觉引导系统。系统通过高效的视觉识别和精确的机械操作&#xff0c;提升工业自动化领域的生产效率和操作精度。 项目背景&#xff1a; 随着工业自动化的不断发展&#xff0c;对生产效率和精确度的要求也日益增高。传统的机械手…

应用层协议HTTP介绍

一、HTTP协议介绍 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一个至关重要的协议。它定义了客户端&#xff08;如浏览器&#xff09;与服务器之间如何通信&#xff0c;以交换或传输超文本。 超文本&#xff1a;视频&#xff0c;音…

【多系统萎缩患者必看】科学锻炼秘籍,让生命之树常青

亲爱的小红书朋友们&#xff0c;&#x1f44b; 今天我们要聊一个温暖而坚韧的话题——关于多系统萎缩&#xff08;MSA&#xff09;患者的锻炼指南。在这个充满挑战的旅程中&#xff0c;锻炼不仅是身体的锻炼&#xff0c;更是心灵的滋养&#xff0c;是对抗病魔的勇敢姿态&#x…

超级全面的Python功能图谱

Python作为一种高级编程语言&#xff0c;以其简洁清晰的语法、强大的标准库以及活跃的社区支持而受到广泛欢迎。无论是在科学计算、数据分析、Web开发还是机器学习等领域&#xff0c;Python都是首选的语言之一。本文旨在提供一个全面的Python功能图谱&#xff0c;覆盖从基础语法…

遗传算法(GA算法)求解实例---旅行商问题 (TSP)

目录 一、采用GA求解 (TSP)二、 旅行商问题2.1 旅行商问题简介2.2 使用遗传算法解决 TSP2.2.1 遗传算法求解 TSP 的基本步骤 2.3 实际例子&#xff1a;求解 6 个城市的 TSP1. 初始化种群2. 计算适应度3. 选择操作4. 交叉操作5. 变异操作6. 生成新种群7. 迭代与终止 三、 **采用…

用户体验在网站建设中的重要性

用户体验在网站建设中的重要性不言而喻。以下是对其重要性的具体介绍&#xff1a; 提升用户满意度&#xff1a;用户体验的优劣直接关系到用户对网站的满意程度。一个设计良好、易于导航、响应迅速的网站能够让用户在使用过程中感到舒适和愉悦&#xff0c;从而增加用户对网站的…

【JavaEE】初识⽹络原理

目录 一、计算机相互连接的方式 1.1 局域网LAN 1.2 广域网WAN 二、网络通信的基础 1.1 IP地址 1.2 格式 1.3 端口号 三、认识协议 1.1 概念 1.2 五元组&#xff1a; 1.3 协议分层 1.4 OSI七层模型 1.5 TCP/IP五层&#xff08;或四层&#xff09;协议 一、计算机相互连…

【计算机网络 - 基础问题】每日 3 题(七)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…