FastAPI 学习六 jinja2模板
·
一、jinja2模板
要了解jinja2,那么需要先理解模板的概念。模板在Python的web开发中⼴泛使⽤,它能够有效的将业务逻辑和页⾯逻辑分开,使代码可读性增强、并且更加容易理解和维护。
模板简单来说就是⼀个其中包涵占位变量表⽰动态的部分的⽂件,模板⽂件在经过动态赋值后,返回给⽤户。
jinja2是Flask作者开发的⼀个模板系统,起初是仿django模板的⼀个模板引擎,为Flask提供模板⽀持,由于其灵活,快速和安全等优点被⼴泛使⽤。
在jinja2中的语法:
- 变量取值 {{ }}
- 控制结构 {% %}
下载使用:
pip install jinja2
1.1 使用 Jinja2Templates
- 导入 Jinja2Templates
- 创建可复用的 templates 对象
- 在返回模板的路径操作中声明 Request 参数
- 使用 templates 渲染并返回 TemplateResponse,传递模板的名称、request 对象以及一个包含多个键值对(用于 Jinja2 模板)的 “context” 字典。
需求:通过接口请求,访问html中的文件。
目录结构
|-- mian.py
|-- templates
|-- index.html
先创建一个main文件
# main.py
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
import uvicorn
app = FastAPI() # 实例化 FastAPI对象
templates = Jinja2Templates(directory="templates") # 实例化Jinja2对象,并将文件夹路径设置为以templates命令的文件夹
@app01.get("/index")
async def index(request: Request):
user = "root"
books = ["本草纲目", "聊斋", "剪灯新话", "国色天香"]
info = {"name": "rain", "age": 17, "gender": "神"}
movies = {
"成年": ["剧情", "情感", "恐怖"],
"刚好成年": ["大陆18"],
"未成年": ["黑猫警长", "大头儿子", "米老鼠"],
}
return templates.TemplateResponse(
"index.html", # 模板文件
{"request": request, # 注意,返回模板响应时,必须有request键值对,且值为Request请求对象
"user": user,
"age": info["age"],
"books": books,
"info": info,
"movies": movies
}, # context 上下文对象,一个字典,就是像模板文件中填充数据的变量
)
if __name__ == '__main__':
uvicorn.run("main:app", port=8080, debug=True, reload=True)
编写模板 templates/index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>用户:{{ user|upper }}</p>
<p>年龄:{{ age }}</p>
<p>四大名著列表:{{ books }}</p>
<ul>
<li>{{ books.0 }}</li>
<li>{{ books.1 }}</li>
<li>{{ books.2 }}</li>
<li>{{ books.3 }}</li>
</ul>
<p>姓名:{{ info.name }}</p>
<p>年龄:{{ info.age }}</p>
<p>性别:{{ info.gender }}</p>
</body>
</html>
访问地址:127.0.0.1:8080/index

解释:
py文件中的变量数据会传入到index.html文件中,然后两个大括号表示引用变量值。
1.2 jinja2 的过滤器
变量可以通过“过滤器”进⾏修改,过滤器可以理解为是jinja2⾥⾯的内置函数和字符串处理函数。常⽤的过滤器有:
| 过滤器名称 | 说明 |
|---|---|
| capitialize | 把值的⾸字母转换成⼤写,其他⼦母转换为⼩写 |
| lower | 把值转换成⼩写形式 |
| title | 把值中每个单词的⾸字母都转换成⼤写 |
| trim | 把值的⾸尾空格去掉 |
| striptags | 渲染之前把值中所有的HTML标签都删掉 |
| join | 拼接多个值为字符串 |
| round | 默认对数字进⾏四舍五⼊,也可以⽤参数进⾏控制 |
| safe | 渲染时值不转义 |
那么如何使⽤这些过滤器呢?只需要在变量后⾯使⽤管道(|)分割,多个过滤器可以链式调⽤,前⼀个过滤器的输出会作为后⼀个过滤
器的输⼊。
{{ 'abc'| captialize }} # Abc
{{ 'abc'| upper }} # ABC
{{ 'hello world'| title }} # Hello World
{{ "hello world"| replace('world','yuan') | upper }} # HELLO YUAN
{{ 18.18 | round | int }} # 18
1.3 jinja2 的控制结构
1.3.1 分支控制
jinja2中的if语句类似与Python的if语句,它也具有单分⽀,多分⽀等多种结构,不同的是,条件语句不需要使⽤冒号结尾,⽽结束控制语句,需要使⽤endif关键字
{% if age > 18 %}
<p>影视区</p>
{% else %}
<p>动画区</p>
{% endif %}
示例使用:
<p>影视区:</p>
<ul>
{% if age > 18 %}
{% for movie in movies['成年'] %}
<li>{{ movie }}</li>
{% endfor %}
{% elif age == 18 %}
{% for movie in movies['刚好成年'] %}
<li>{{ movie }}</li>
{% endfor %}
{% else %}
{% for movie in movies['未成年'] %}
<li>{{ movie }}</li>
{% endfor %}
{% endif %}
</ul>

1.3.2 循环控制
jinja2中的for循环⽤于迭代Python的数据类型,包括列表,元组和字典。在jinja2中不存在while循环。
{% for book in books %}
<p>{{ book }}</p>
{% endfor %}
示例使用:
<p>循环展示书籍:</p>
<ul>
{% for book in books %}
<li>{{ book }}</li>
{% endfor %}
</ul>

整体html代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>用户:{{ user|upper }}</p>
<p>年龄:{{ age }}</p>
<p>四大名著列表:{{ books }}</p>
<ul>
<li>{{ books.0 }}</li>
<li>{{ books.1 }}</li>
<li>{{ books.2 }}</li>
<li>{{ books.3 }}</li>
</ul>
<p>姓名:{{ info.name }}</p>
<p>年龄:{{ info.age }}</p>
<p>性别:{{ info.gender }}</p>
<p>影视区:</p>
<ul>
{% if age > 18 %}
{% for movie in movies['成年'] %}
<li>{{ movie }}</li>
{% endfor %}
{% elif age == 18 %}
{% for movie in movies['刚好成年'] %}
<li>{{ movie }}</li>
{% endfor %}
{% else %}
{% for movie in movies['未成年'] %}
<li>{{ movie }}</li>
{% endfor %}
{% endif %}
</ul>
<p>循环展示书籍:</p>
<ul>
{% for book in books %}
<li>{{ book }}</li>
{% endfor %}
</ul>
</body>
</html>
更多推荐
所有评论(0)