如何通过FastAPI将list-of-dict自定义对象传递给Jinja2模板?
解决FastAPI传递List[Dict]到Jinja2模板的问题
问题原因
你当前的Jinja2模板代码是针对单个字典对象编写的(比如直接调用{{ 对象.items() }}或直接取字典键值),当传入整个列表时,模板试图对列表调用items()方法,但列表本身没有这个属性,因此触发UndefinedError。
解决方案
1. 调整FastAPI路由代码
确保传递完整的爬取列表,示例代码如下:
from fastapi import FastAPI, Request from fastapi.templating import Jinja2Templates import data_t3 app = FastAPI() templates = Jinja2Templates(directory="templates") @app.get("/scrape") async def read_scrape(request: Request): # 获取完整爬取数据列表并传入模板 scraped_data = data_t3.scraper_t3() return templates.TemplateResponse("scrape.html", {"request": request, "data_list": scraped_data})
2. 修改Jinja2模板代码
使用Jinja2的for循环遍历列表,逐个处理每个字典元素。
如果旧模板是针对单个字典编写的:
<!-- 旧模板(适配单个字典) --> <div> {% for key, value in data.items() %} <p>{{ key }}: {{ value }}</p> {% endfor %} </div>
则修改为适配列表的版本:
<!-- 新模板(遍历列表) --> <div> {% for item in data_list %} <div class="data-item"> {% for key, value in item.items() %} <p>{{ key }}: {{ value }}</p> {% endfor %} <hr> </div> {% endfor %} </div>
3. 额外优化提示
- 若爬取数据量较大,可加入分页逻辑或异步渲染,避免页面加载卡顿
- 模板中可添加空列表判断,提升体验:
{% if not data_list %} <p>暂无爬取数据</p> {% endif %}
内容的提问来源于stack exchange,提问作者gimmedata
相关产品推荐
相关产品推荐

