乐于分享
好东西不私藏

智能体开发|Jinja2模版引擎

智能体开发|Jinja2模版引擎

模板引擎的引入主要用于解决以下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 HTMLResponse  import 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)