Code前端首页关于Code前端联系我们

Web API 项目中的 FastAPI 快速开发模板和 Jinja

terry 2年前 (2023-09-24) 阅读数 59 #后端开发

Jinja 是什么

模板是全栈 Web 开发的重要组成部分。使用 Python,您可以构建全面的模板来驱动 Python Web 应用程序的前端。

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

安装jinja2:

pipenv install jinja2

安装成功后:FastAPI 快速开发 Web API 项目中的模板和 Jinja

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

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

Jinja 的模板引擎使用大括号 {} 来区分其表达式和语法与模板文件中的纯 HTML、文本和其他变量。 {{}} 语法称为变量块。 {% %} 语法包括 if/else、循环和宏等控制结构。 Jinja 模板语言中使用的三种常见语法块包括:

  • {% ... %}:此语法用于控制结构等语句。
  • {{todo.item}}:此语法用于打印传递给它的表达式的值。
  • {#测试#}:此语法用于编写注释,不会显示在网页上。

Jinja2 是 Fl​​ask、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 环境。稍后,您将更改环境参数来自定义您的环境。这里您创建了一个正常的环境,可以在其中加载字符串 Hello, {{name}}!作为模板。

此示例显示了使用 Jinja 时通常要执行的两个重要步骤:

  1. 加载模板:加载包含占位符变量的源。默认情况下,它们包含在一对大括号 {{}} 中。
  2. 渲染模板:用内容填充占位符。您可以指定字典或关键字参数作为上下文。在本例中,您填写了占位符,所以嗨,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 快速开发 Web API 项目中的模板和 Jinja

启动 FastAPI 服务 uvicorn main:app --reload --port 8888 ,然后打开另一个终端并运行curl 127.0.0.1:8888/Yuzhou1su命令。您可以看到以下名称的渲染结果:FastAPI 快速开发 Web API 项目中的模板和 Jinja

通过浏览器访问此名称http://127.0.0。 0.1:8888/Yuzhou1su,还可以看到css渲染的颜色:FastAPI 快速开发 Web API 项目中的模板和 Jinja

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

变量

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

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

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

以下几行执行相同的操作:

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

Filters

虽然Python和Jinja的语法非常相似,但可以执行诸如连接字符串、将字符串的第一个字符大写等修改操作Jinja的 Python 语法。因此,我们在Jinja中使用过滤器来执行此类修改操作。

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

{{ variable | filter_name(*args) }}

无参数过滤:

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

默认过滤器 :如果值未定义,则返回传入的默认值,否则返回变量的值:

{{ 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') }}

length 过滤器:此过滤器返回序列或集合的长度,其工作方式与 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 %}

循环条件

我们还可以在 Jinja 中迭代变量。这可以是一个列表或一个通用函数,如下所示,例如

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

您可以在 for 循环(例如循环)中访问特殊变量。 index ,给出当前迭代的索引。 FastAPI 快速开发 Web API 项目中的模板和 Jinja

宏可以与常见编程语言中的函数进行比较。它们有助于将常用的习惯用法放入可重用的函数中,这样您就不会重复自己(“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 获取数据是一个不错的选择。

参考链接:

  • 模板
  • 终极 FastAPI 教程第 6 部分 - 使用 Jinja 模板提供 HTML
  • FastAPI 中的简单 ToDo 应用程序与 Jinja‶Jinja‶PlateP 模板设计器文档

Auth或:恩掉落在宇宙中。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门