FastAPI中Jinja2外部宏文件使用url_for触发KeyError: 'request'异常
FastAPI中Jinja2外部宏文件使用url_for触发KeyError: 'request'异常
这个问题我之前踩过一模一样的坑!核心原因是外部宏文件默认无法访问主模板的上下文变量——哪怕你把request作为参数传给宏函数,FastAPI集成的url_for模板函数还是会尝试从宏自身的上下文里找request,而不是用你传入的参数,所以才会抛出KeyError: 'request'。
这里有两个简单有效的解决办法:
方法一:直接使用Request对象的url_for方法
FastAPI的Request实例本身就内置了url_for方法,我们可以直接在宏里调用这个方法,完全不需要依赖模板上下文:
修改templates/macros/header.html的宏代码:
{% macro header(request) %} <header class="header"> <div class="header__logo"> {{ request.url }} <img class="header__logo-image" alt="Email Sharer" src="{{ request.url_for('img', path='logo.png') }}"> </img> </div> </header> {% endmacro %}
这种方法更直接,而且不需要修改主模板的导入逻辑,只要保证调用宏时传入了request对象就行。
方法二:导入宏时带上上下文
如果你想保留原来url_for('img', path='logo.png')的写法,可以在导入宏的时候加上with context,让外部宏继承主模板的所有上下文变量(包括request):
修改templates/base.html里的导入语句:
{% import 'macros/header.html' as header with context %}
这样宏里的url_for就能正常从上下文里获取到request对象,不需要修改宏内部的代码。
两种方法都能完美解决问题,你可以根据自己的代码习惯选择~
备注:内容来源于stack exchange,提问作者Krapp
相关产品推荐
相关产品推荐

