FastAPI端点适配Jinja2求助:列表对象与上下文报错
问题解决方案
1. 适配Jinja2的核心修改逻辑
你之前的端点返回SQLAlchemy模型实例列表时,FastAPI会自动序列化,但Jinja2需要直接操作模型实例的属性。报错的核心原因是未正确传入模板上下文要求的request对象,或是模板中错误地将模型实例当作字典访问。
2. 修正后的端点代码
from fastapi import Request, Depends, APIRouter from sqlalchemy.orm import Session # 替换为你的实际模块路径 from your_module import get_session, Customers, templates router = APIRouter() @router.get("/customers/") async def read_customers( request: Request, # 必须注入Request对象,满足TemplateResponse的要求 session: Session = Depends(get_session) ): customers = session.query(Customers).all() # 上下文必须包含request,同时传入模板需要的变量 return templates.TemplateResponse( "index.html", {"request": request, "customers": customers} )
3. Jinja2模板示例(index.html)
直接遍历模型实例列表,通过属性访问字段即可:
<!DOCTYPE html> <html> <head> <title>客户列表</title> </head> <body> <h1>客户列表</h1> <ul> {% for customer in customers %} <li>{{ customer.customerNumber }} - {{ customer.customerName }}</li> {% endfor %} </ul> </body> </html>
关键注意点
- 必须传入request:FastAPI的
TemplateResponse依赖request对象处理模板上下文(如路由、静态文件路径等),因此上下文里必须包含该键。 - 模型实例可直接使用:无需将模型转成字典,Jinja2能直接访问SQLAlchemy模型的属性;若确实需要字典格式,可使用
customer.__dict__或FastAPI的jsonable_encoder转换,但通常没必要。
内容的提问来源于stack exchange,提问作者Scotty
相关产品推荐
相关产品推荐

