模板引擎的引入主要用于解决以下3个问题。
(1)把Python代码和前端HTML代码分离,不再采用混编的方式来编写代码,在提高代码可维护性的同时提升代码的开发效率。
(2)在渲染模板界面的同时,可以向模板界面传递变量和值,这些变量和值将在模板界面中被引用,从而直接在HTML界面中填充动态内容。
(3)通过模板引擎特定的语法规则,可以在HTML中非常清楚地标识模板变量,同时服务器在渲染模板界面时,也能够更加高效地进行处理,提升服务器响应性能。

核心语法
Jinja2模板引擎定义了以下3种基本引用标识符。
(1){% ... %}:用于循环或判断语句。
(2){{ ... }}:用于表达式的值的引用。
(3){# ... #}:用于模板引擎的注释。如果注释中存在模板引擎的语法,那么使用<!-- -->将不被模板引擎认为是注释,注释中的语句将被运行,此时应使用{# ... #}进行注释。
html demo
<!DOCTYPE html><htmllang="en"><head><metacharset="utf-8"></meta><title>Jinjia2</title></head><body><divstyle="width: 300px;height: 150px;border: solid 2px red;text-align: center;padding: 20px;line-height: 40px;"><!-- 使用双括号来引用模版变量 --><span>作者{{ name }}</span><span>文章{{ title }}</span><span>访问量{{count + 1}}</span><br /><!-- 模版引擎的if... else .. 语句-->{% if count % 2 == 0 %}<span>偶数</span>{% else %}<span>奇数</span>{% endif %}<!-- 模版引擎的for.. in .. 循环,如果是列表,则使用for item in items -->{% set loop = count / 2 %} {# 将loop变量设置为count/2 的值 #}{% set intloop = loop|int %} {# 利用过滤器将loop变量转换为整数 #}{% for i in range(intloop) %} {# 正常循环,语法和python一致 #}<span>当前循环到第{{ i }}</span><br />{% endfor %}{% set user=get_user() %} {# 自定义方法 #}用户名为{{ user.username }},密码为{{ user.password }}</div></body></html>
python api
from fastapi import FastAPI,Requestfrom fastapi.templating import Jinja2Templatesfrom fastapi.responses import HTMLResponseimport uvicornapp = FastAPI()# 实现Jinja2模板引擎,并设定模版文件的目录为templatestemplates = Jinja2Templates(directory="templates")# 定义一个函数,可返回任意类型的数据def get_user():return {"name":"uncle_tu","password":"123456"}# 添加自定义函数到Jinja2中,可在模版中调用templates.env.globals.update(get_user=get_user)# 设定响应的类型为HTMLResponse,以使用text/html作为响应类型# 在函数中必须定义Request为参数,这是固定要求@app.get("/", response_class=HTMLResponse)def jinjia2_demo(request: Request):article ={"name":"admin","title":"Jinja2 Template", "count":7}return templates.TemplateResponse(name = "015_jinjia2.html", request= request,context=article)if __name__ == "__main__":uvicorn.run(app, host="127.0.0.1", port=8000)

过滤器
过滤器本质上是一个函数,它将变量作为函数的参数传递进去,处理后再返回新的值到调用处。例如,loop | int可以理解为loop = int(loop)


夜雨聆风