带你了解关于FastAPI快速开发Web API项目中的模板和Jinja

这篇具有很好参考价值的文章主要介绍了带你了解关于FastAPI快速开发Web API项目中的模板和Jinja。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

摘要:FastAPI 实际上是为构建 API 和微服务而设计的。它可用于构建使用 Jinja 提供 HTML 服务的 Web 应用程序。

本文分享自华为云社区《FastAPI 快速开发 Web API 项目: 模板和 Jinja 介绍》,作者:宇宙之一粟。

什么是 Jinja

模板是全栈 Web 开发的重要组成部分。使用 Jinja,您可以构建丰富的模板,为您的 Python Web 应用程序的前端提供支持。

Jinja 是一个用 Python 编写的模板引擎,旨在帮助 API 响应的渲染过程。在每种模板语言中,都有变量被替换为实际传递给它们的值,当模板被渲染时,有控制模板逻辑的标签。

安装 jinja2:

pipenv install jinja2

安装成功后:

Jinja 模板只是一个文本文件。 Jinja 可以生成任何基于文本的格式(HTML、XML、CSV、LaTeX 等)。 Jinja 模板不需要有特定的扩展名:.html、.xml 或任何其他扩展名都可以。

关于模版的扩展名:任何文件都可以作为模板加载,无论文件扩展名如何。添加 .jinja 扩展名,如 user.html.jinja 可能会使某些 IDE 或编辑器插件更容易,但这不是必需的。自动转义可以基于文件扩展名应用,因此在这种情况下您需要考虑额外的后缀。
识别模板的另一个很好的启发式方法是它们位于模板 templates 文件夹中,而不管扩展名是什么。这是项目的常见布局。

Jinja 模板引擎使用花括号 {} 来区分其表达式和语法与常规 HTML、文本和模板文件中的任何其他变量。{{}} 语法称为变量块。{% %} 语法包含控制结构,如 if/else 、循环和宏。Jinja 模板语言中使用的三种常见语法块包括以下内容:

  • {% ... %}:这种语法用于控制结构等语句。
  • {{ todo.item }}:这个语法用于打印出传递给它的表达式的值。
  • {# Test #}: 这种语法在写评论时使用,不在网页上显示。

Jinja2 是一种流行的模板语言,被 Flask、Bottle、Pelican 使用,也可被 Django 使用。

渲染第一个 Jinja 模板

导入 Jinja 后,您可以继续加载和渲染您的第一个模板:

>>> import jinja2
>>> environment = jinja2.Environment()
>>> template = environment.from_string("Hello, {{ name }}!") 
>>> template.render(name="Yuzhou1su")
'Hello, Yuzhou1su!'
>>>

Jinja 的核心组件是 Environment() 类。在此示例中,您创建了一个不带任何参数的 Jinja 环境。稍后您将更改 Environment 的参数以自定义您的环境。在这里,您正在创建一个普通环境,您可以在其中加载字符串 Hello, {{ name }}! 作为模板。

这个例子显示了你在使用 Jinja 时通常会执行的两个重要步骤:

  1. 加载模板:加载包含占位符变量的源。默认情况下,它们包含在一对大括号 {{ }} 中。
  2. 渲染模板:用内容填充占位符。您可以提供字典或关键字参数作为上下文。在本例中,您已经填充了占位符,因此 Hello, Yuzhou1su! 作为输出。

使用外部文件作为模板

与上述方式同理,我们可以使用外部文件作为我们的模版来源,在我们的项目中创建一个新文件夹。在工作目录中,创建一个名为 templates/ 的文件夹。

然后,您可以在 “template” 目录中创建 index.html 模板文件,并使用 Jinja2 语法来呈现它们。例如,在template/index.html 中写入如下内容:

<!DOCTYPE html>
<html>
 <head>
 <title>Welcome</title>
 <link href="{{ url_for('static', path='/styles.css') }}" rel="stylesheet">
 </head>
 <body>
 <h1>Hello, {{ name }}</h1>
 </body>
</html>

然后回到我们的 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("/{name}")
async def home(request: Request, name: str):
 return templates.TemplateResponse("index.html", {
 "request": request,
 "name": name
 })

整个文件的目录结构如下:

启动 FastAPI 服务 uvicorn main:app --reload --port 8888, 然后另外打开一个终端,执行 curl 127.0.0.1:8888/Yuzhou1su 命令,可以看到如下 name 被渲染出来的结果:

通过浏览器访问这个 http://127.0.0.1:8888/Yuzhou1su,还能看到 css 渲染的颜色:

Jinja 模板变量可以是任何 Python 类型或对象,只要它们可以转换为字符串。可以将模型、列表或字典类型传递到模板中,并通过将这些属性放置在先前列出的第二个块中来显示其属性。在下一节中,我们将看一下过滤器。过滤器是每个模板引擎的重要组成部分,在 Jinja 中,过滤器使我们能够执行某些函数,例如从列表中连接值和检索对象的长度,等等。Jinja 中常用的功能:变量、过滤器、if 语句、循环、宏和模板继承。

变量

模板变量由传递给模板的上下文字典定义。

在模板中,只要应用程序传递了变量,您就可以随意操作这些变量。变量可能还具有您可以访问的属性或元素。变量具有哪些属性取决于提供该变量的应用程序。

除了标准的 Python __getitem__ “下标”语法( [] )之外,您还可以使用点(. )来访问变量的属性。

以下行执行相同的操作:

{{ foo.bar }}
{{ foo['bar'] }}

Filters

尽管 Python 和 Jinja 的语法非常相似,但是像连接字符串、将字符串的第一个字符设置为大写等修改操作不能使用Python 的语法在 Jinja 中完成。因此,为了执行这样的修改操作,我们在 Jinja 中使用过滤器。

变量可以被过滤器修改。过滤器与变量用管道符号(|)分隔,并且可以在括号中包含可选参数。可以链接多个过滤器。一个过滤器的输出应用于下一个。过滤器的定义格式如下:

{{ variable | filter_name(*args) }}

不加参数的过滤器:

{{ variable | filter_name }}
{{ name|striptags|title }}

default 过滤器: 如果该值未定义,它将返回传递的默认值,否则返回变量的值:

{{ my_variable | default('my_variable is not defined') }}

escape 过滤器: 这个过滤器用于渲染原始 HTML 输出:将字符串 s 中的字符 & < > ' ” 转换为 HTML 安全序列。如果您需要在 HTML 中显示可能包含此类字符的文本,请使用此选项。将返回值标记为标记字符串。

{{ "<title>Todo Application</title>" | escape }}
<title>Todo Application</title>

类型转换过滤器: 这些过滤器包括 int 和 float 过滤器,用于从一种数据类型转换到另一种数据类型:

{{ 3.142 | int }}
3
{{ 20 | float }}
20.0

join 过滤器:join(*value*, *d=u''* , *attribute=None*)返回一个字符串,它是序列中字符串的串联。元素之间的分隔符默认为空字符串,您可以使用可选参数定义它:

{{ [1, 2, 3] | join('|') }}
 -> 1|2|3
{{ [1, 2, 3] | join }}
 -> 123

也可以连接对象的某些属性:

{{ users|join(', ', attribute='username') }}

长度 filter: 这个过滤器返回一个序列或集合的长度,它的作用与 Python 中 len() 函数的作用相同:

Todo count: {{ todos | length }}
Todo count: 4

if 条件

Jinja 中 if 语句的用法与 Python 中的用法类似。在 {% %} 控制块中使用。让我们看一个例子:

{% if todos %}
<ul>
{% for todo in todos %}
 <li>{{ todo.name|e }}</li>
{% endfor %}
</ul>
{% endif %}

Loop 条件

我们也可以在Jinja中对变量进行迭代。这可以是一个列表或一个一般的函数、 比如说下面这个,例如

{% for todo in todos %}
 <li>{{ todo.name|e }}</li>
{% endfor %}

你可以在 for 循环中访问特殊的变量,比如 loop.index ,它给出了当前迭代的索引。

宏可与常规编程语言中的函数相媲美。它们有助于将常用的习语放入可重用的函数中,以免重复自己(“DRY” 原则)。

{% macro input(name, value='', type='text', size=20) %}
 <div class="form">
 <input type="{{ type }}" name="{{ name }}"
            value="{{ value|escape }}" size="{{ size }}">
 </div>
{% endmacro %}

现在,为了在你的表单中快速创建一个输入,调用了这个宏:

{{ input('item') }}

渲染完成后,将会返回:

 <div class="form">
 <input type="text" name="item" value="" size="20" />
 </div>

FastAPI 中的 Jinja

FastAPI 实际上是为构建 API 和微服务而设计的。它可用于构建使用 Jinja 提供 HTML 服务的 Web 应用程序,但这并不是它真正优化的目的。

如果您想构建一个在服务器上呈现大量 HTML 的大型网站,Django 可能是更好的选择。

但是,如果您正在使用 React、Angular 或 Vue 等前端框架构建现代网站,那么从 FastAPI 获取数据是一个不错的选择。

参考链接:

  • Templates
  • The Ultimate FastAPI Tutorial Part 6 - Serving HTML with Jinja Templates
  • Simple ToDo App in FastAPI with Jinja2 Template
  • Primer on Jinja Templating
  • Template Designer Documentation

 

点击关注,第一时间了解华为云新鲜技术~文章来源地址https://www.toymoban.com/news/detail-424690.html

到了这里,关于带你了解关于FastAPI快速开发Web API项目中的模板和Jinja的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FastAPI 构建 API 高性能的 web 框架(一)

    如果要部署一些大模型一般langchain+fastapi,或者fastchat, 先大概了解一下fastapi,本篇主要就是贴几个实际例子。 官方文档地址: https://fastapi.tiangolo.com/zh/ 来源:大语言模型工程化服务系列之五-------复旦MOSS大模型fastapi接口服务 服务端代码: api启动后,调用代码: 来源: 大语

    2024年02月13日
    浏览(45)
  • FastAPI 构建 API 高性能的 web 框架(二)

    上一篇 FastAPI 构建 API 高性能的 web 框架(一)是把LLM模型使用Fastapi的一些例子,本篇简单来看一下FastAPI的一些细节。 有中文官方文档:fastapi中文文档 假如你想将应用程序部署到生产环境,你可能要执行以下操作: 并且安装uvicorn来作为服务器: 然后对你想使用的每个可选

    2024年02月12日
    浏览(47)
  • 【Node.js实战】一文带你开发博客项目(API 对接 MySQL)

    个人简介 👀 个人主页: 前端杂货铺 🙋‍♂️ 学习方向: 主攻前端方向,也会涉及到服务端 📃 个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀 未来打算: 为中国的工业软件事业效力n年 🥇 推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2Vue3项目实战 🥝

    2024年02月02日
    浏览(65)
  • 快速搭建API随心搭,让你的web开发更加高效

    随着互联网的发展,越来越多的应用和服务需要通过API接口来实现。API(Application Programming Interface,应用程序编程接口)可以理解为两个软件之间的桥梁,通过API接口,两个软件可以相互交流并进行数据交换。如今,API已经成为许多公司和应用程序的核心,因此快速搭建并管

    2024年02月08日
    浏览(50)
  • 【Docker】快速入门,带你快速了解 Docker

    文章底部有投票活动,赶快参与进来吧😃 相信大家在开发过程中都听说过 Docker 一词,至于 Docker 在开发中扮演的角色,估计好多人都说不上来,今天就让阿Q带大家一起揭开它神秘的面纱! 容器是一种用于 封装软件和相关环境 的标准化技术,它提供了一种轻量级、可移植、

    2024年02月16日
    浏览(46)
  • 带你彻底了解什么是API接口?

    作为一名资深程序员,我知道很多人对API接口这个名词可能还不太了解。今天我要给大家分享一些关于API接口的知识,让你们彻底了解它的概念和作用。一起来看看吧! 首先,我们先来解释一下API的全称─Application Programming Interface。简单来说,API是软件系统间相互通信的一种

    2024年02月13日
    浏览(42)
  • 带你快速了解字符(串)函数

    ​ ⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 💖 持续更文,谢谢大家支持 💖 函数作用 函数名 求字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strncat strncmp 字符串查找 strstr strtok 错误信息报告 strerror 内存操

    2024年02月16日
    浏览(40)
  • 开发API? FastAPI有效处理长时间运行任务的策略!

    快速且高效地构建API是现代软件开发的一个基础方面。然而,由于数据处理、第三方服务调用或复杂计算等原因,经常会遇到执行时间较长的API端点。面对这样的情况,确保这些长时间运行的任务不会降低用户体验或系统性能至关重要。本博客文章旨在指导您如何在FastAPI中管

    2024年02月10日
    浏览(34)
  • 如何重装系统?(带你快速了解)

    目录 备份数据 获取安装媒体 创建安装媒体 设置启动顺序 启动计算机 进入安装程序 选择分区和格式化 完成安装 安装驱动程序和更新 备份数据 在重新安装操作系统之前,务必备份所有重要数据。这可以通过将文件复制到外部硬盘、使用云存储服务或其他备份方法来完成。

    2024年02月01日
    浏览(41)
  • 常见的文件系统格式(带你快速了解)

    目录 一、Windows 常见文件系统格式 1、FAT32格式 2、NTFS格式 3、exFAT格式 二、Linux 常见文件系统格式 1、介绍 2、详细内容 1、FAT32格式 1、属于Windows平台的传统文件格式 2、兼容性很好 3、但它不支持4GB以上的文件 2、NTFS格式 1、属于Windows平台应用最广泛的文件格式 2、能够支持

    2024年02月13日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包