FastAPI中向Jinja2Templates传递globals报错,如何正确配置全局变量?
FastAPI中Jinja2模板全局变量配置问题
问题场景
你尝试参考Starlette源码,通过给fastapi.templating.Jinja2Templates构造函数传递globals参数设置模板全局变量,编写代码如下:
from fastapi.templating import Jinja2Templates templates = None try: templates = Jinja2Templates(directory=f"{webroot}", globals={"myglobal":"somevalue"}) except Exception as e: logger.exception("No templates folder found, skipping...")
应用启动时触发异常,报错信息:
No templates folder found, skipping... Traceback (most recent call last): File "/app/main.py", line 22, in <module> templates = Jinja2Templates(directory=f"{webroot}", globals={"myglobal":"somevalue"}) File "/app/venv/lib/python3.7/site-packages/starlette/templating.py", line 74, in __init__ self.env = self._create_env(directory, **env_options) File "/app/venv/lib/python3.7/site-packages/starlette/templating.py", line 89, in _create_env env = jinja2.Environment(**env_options) TypeError: __init__() got an unexpected keyword argument 'globals'
问题原因
Jinja2Templates的构造函数不会直接将globals参数传递给jinja2.Environment,你对Starlette源码的参数传递方式存在误解。jinja2.Environment的全局变量并不是通过构造函数关键字参数传入,而是需要修改其内置的globals字典。
正确配置方式
创建Jinja2Templates实例后,直接修改它的env.globals字典即可添加全局变量:
from fastapi.templating import Jinja2Templates templates = None try: templates = Jinja2Templates(directory=f"{webroot}") # 直接向环境的globals字典添加全局变量 templates.env.globals["myglobal"] = "somevalue" except Exception as e: logger.exception("模板初始化失败,跳过配置...")
另外注意:你当前捕获异常时的日志提示"No templates folder found"并不匹配实际报错原因(参数错误而非目录不存在),建议调整日志内容以避免误导。
内容的提问来源于stack exchange,提问作者Mr. Developerdude
相关产品推荐
相关产品推荐

