You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 11:12:59