当前位置: 首页 > news >正文

FastAPI系列(15):Jinja2模板语法之控制结构

 

本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/19503695

分支控制:if

image

jinja2中的if语句类似与Python的if语句,它也具有单分⽀,多分⽀等多种结构,不同的是,条件语句不需要使⽤冒号结尾,⽽结束控制语句,需要使⽤endif关键字。

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
{% if age >= 18 %}<p>{{age}}:成年了</p>{% else %}<p>{{age}}:未成年</p>{% endif %}</body>
</html>

  

test_jinja2.py

import uvicorn
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templatesapp = FastAPI()templates = Jinja2Templates(directory="templates")  # 实例化Jinja2对象,并将文件夹路径设置为以templates命令的文件夹@app.get("/index")
def index(request: Request):  # TemplateResponse要求上下文包含Request类型的对象,这里需要传入age = 18return templates.TemplateResponse("index.html",  # 模板文件{"age": age,"request": request,  # TemplateResponse要求上下文(context)中必须包含 "request" 键,value是Request类型对象},  # context上下文对象,一个字典)if __name__ == '__main__':uvicorn.run("test_jinja2:app", port=8001, reload=True)

  

image

 

循环控制:for

jinja2中的for循环⽤于迭代Python的数据类型,包括列表,元组和字典。在jinja2中不存在while循环。

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><!--使用 loop.index(从 1 开始-->
<ul>{% for hobby in hobbies %}<li>{{ loop.index }}:{{hobby}}</li>{% endfor %}
</ul><!--使用 loop.index0(从 0 开始)-->
<ul>{% for hobby in hobbies %}<li>{{ loop.index0 }}:{{hobby}}</li>{% endfor %}
</ul><!--使用 loop.revindex(倒序)-->
<ul>{% for hobby in hobbies %}<li>{{ loop.revindex }}:{{hobby}}</li>{% endfor %}
</ul></body>
</html>

  

test_jinja2.py

import uvicorn
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templatesapp = FastAPI()templates = Jinja2Templates(directory="templates")  # 实例化Jinja2对象,并将文件夹路径设置为以templates命令的文件夹@app.get("/index")
def index(request: Request):  # TemplateResponse要求上下文包含Request类型的对象,这里需要传入hobbies = ["coding", "swimming", "basketball"]return templates.TemplateResponse("index.html",  # 模板文件{"hobbies": hobbies,"request": request,  # TemplateResponse要求上下文(context)中必须包含 "request" 键,value是Request类型对象},  # context上下文对象,一个字典)if __name__ == '__main__':uvicorn.run("test_jinja2:app", port=8001, reload=True)

 

结果

image

 

分支嵌套循环:if嵌套for

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
{% if age >= 18 %}
<p>成年人:</p>
<ul>{%for name in person.adults%}<li>{{name}}</li>{% endfor %}
</ul>{% else %}
<p>未成年人:</p>
<ul>{%for name in person.minors%}<li>{{name}}</li>{% endfor %}
</ul>{% endif %}</body>
</html>

  

test_jinja2.py

import uvicorn
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templatesapp = FastAPI()templates = Jinja2Templates(directory="templates")  # 实例化Jinja2对象,并将文件夹路径设置为以templates命令的文件夹@app.get("/index")
def index(request: Request):  # TemplateResponse要求上下文包含Request类型的对象,这里需要传入age = 18person = {"adults": ["李一", "李二", "李三"], "minors": ["王一", "王二"]}return templates.TemplateResponse("index.html",  # 模板文件{"person": person,"age": age,"hobbies": hobbies,"request": request,  # TemplateResponse要求上下文(context)中必须包含 "request" 键,value是Request类型对象},  # context上下文对象,一个字典)if __name__ == '__main__':uvicorn.run("test_jinja2:app", port=8001, reload=True)

  

结果

image

 

循环嵌套分支:for嵌套if

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h3>price高于100的书有:</h3>
<ul>{%for book in books%}{% if book.price > 100 %}<li>{{book.title}}</li>{% endif %}{% endfor %}
</ul>
<h3>price低于80的书有:</h3>
<ul>{%for book in books%}{% if book.price <80 %}<li>{{book.title}}</li>{% endif %}{% endfor %}
</ul></body>
</html>

  

test_jinja2.py

import uvicorn
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templatesapp = FastAPI()templates = Jinja2Templates(directory="templates")  # 实例化Jinja2对象,并将文件夹路径设置为以templates命令的文件夹@app.get("/index")
def index(request: Request):  # TemplateResponse要求上下文包含Request类型的对象,这里需要传入books = [{"title": "性能分析调优", "price": 90},{"title": "Python基础", "price": 50},{"title": "Python爬虫入门", "price": 60},{"title": "Python爬虫进阶", "price": 130},{"title": "Python进阶", "price": 120}]return templates.TemplateResponse("index.html",  # 模板文件{"books": books,"request": request,  # TemplateResponse要求上下文(context)中必须包含 "request" 键,value是Request类型对象},  # context上下文对象,一个字典)if __name__ == '__main__':uvicorn.run("test_jinja2:app", port=8001, reload=True)

  

结果

image

 

http://www.jsqmd.com/news/309617/

相关文章:

  • Cisco 350-601 認證介紹|CCNP Data Center 核心考試解析
  • 运维系列【亲测有效】:Linux 系统根分区满了怎么办(根分区不是lvm不可以直接扩充的前提下)
  • 运维系列【亲测有效】:Ubuntu18.04手动编译安装nginx
  • 曜华硬核出征!三台核心光伏检测设备启运,力擎行业品质标杆
  • HELLY HANSEN携手香港游艇会扬帆启航 承百年航海精神,启东方航道新程
  • 如何在Android设备上删除多个联系人(3种方法)
  • 如何在没有iTunes的情况下将照片从iPad 传输到PC
  • 做电商商品卖点提炼工具,输入商品详情,自动提取核心卖点(功能/材质/性价比),生成适配电商详情页的卖点文案,分点展示更清晰。
  • 一个视频了解什么是Peforce JRebel?为何能让你告别Java开发的“时间黑洞”?
  • 学习记录260127
  • 从一道面试题看算法思维:最小栈(Min Stack)的从 O(N) 到 O(1) 进化之路
  • 史上最强Java八股文面试题,持续更新
  • Coze搭建工作流(爆款视频、调研报告、海报生成等实操)-精讲版
  • 别只盯着 LangChain!带你起底 LangGraph 和 DeepAgents:Agent 真正落地生产环境的必经之路
  • 伦敦银飙破110美元:库存危机与工业需求的合力
  • 数据共享的五大核心技术,大数据工程师必看!
  • 『NAS』在群晖部署一个搜片神器-aipan
  • 『n8n』读写本地文件
  • Edge SCDN是如何实现智能 WAF 防护的?
  • 揭秘Agentic AI+区块链的核心痛点:提示工程架构师如何用Prompt设计破解数据孤岛?
  • ​​​​​​​通过西门子平台 API 接口高效获取 XMZ 详情数据
  • 实测拆解:Qwen3-Max-Thinking 到底能不能对标 GPT-5.2?
  • MyBatis-Plus核心组件解析:BaseMapper与IService的区别、优劣及用法
  • 省选集训 22 - 数据结构
  • Class1-100洁净环境下,能传输翘曲晶圆的搬运机械手怎么选?
  • 步进控制的光栅尺全闭环EtherCAT运动控制器ZMC432CL-V2快速入门:二维螺距补偿(上)
  • 2023A卷,硬件产品销售方案
  • mapbox进阶,使用geoserver矢量切片图层组服务(pbf)加载图层
  • 【收藏级干货】大模型技术演进全景图:从GPT-4到智能体的技术变革与未来趋势
  • 无人机视角智慧河道巡检河道违建河道违规建筑检测数据集VOC+YOLO格式1034张1类别