一、jinja2模板

要了解jinja2,那么需要先理解模板的概念。模板在Python的web开发中⼴泛使⽤,它能够有效的将业务逻辑和页⾯逻辑分开,使代码可读性增强、并且更加容易理解和维护。
模板简单来说就是⼀个其中包涵占位变量表⽰动态的部分的⽂件,模板⽂件在经过动态赋值后,返回给⽤户。

jinja2是Flask作者开发的⼀个模板系统,起初是仿django模板的⼀个模板引擎,为Flask提供模板⽀持,由于其灵活,快速和安全等优点被⼴泛使⽤。

在jinja2中的语法

  1. 变量取值 {{ }}
  2. 控制结构 {% %}

下载使用:

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>
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐