不能在jinja2宏中使用current_user?

cor*_*vid 11 python jinja2 flask

我使用Flask-Login,它current_user在模板中提供对象.我想写一个宏来显示评论表单或登录链接,具体取决于用户是否登录.如果我直接在模板中使用此代码,它可以工作:

{% if current_user.is_authenticated %}
    {{ quick_form(form) }}
{% else %}
    <a href="{{ url_for('auth.login') }}">Log In with Github</a>
{% endif %}
Run Code Online (Sandbox Code Playgroud)

我在宏中放置了相同的代码,并在我的模板中导入宏.

{% macro comment_form(form) %}
    {% if current_user.is_authenticated %}
        ...
    {% endif %}
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)
{% from "macros/comments.html" import comment_form %}
{% extends "base.html" %}
{% block content %}
    {# ... content goes here ... #}
    {{ comment_form(form) }}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

当我尝试加载此页面时,我得到的错误是:

jinja2.exceptions.UndefinedError: 'current_user' is undefined
Run Code Online (Sandbox Code Playgroud)

当然,简单的解决方法是current_user作为参数传入并使用它(制作签名comment_form(user, form)),尽管这是一个相当丑陋的解决方案(imo).

为什么宏不使用上下文处理器?它不具备背景吗?

dav*_*ism 15

除非指示执行此操作,否则呈现模板的上下文不会传递给导入.请参阅相关文档.

你是对的,你不需要将上下文作为参数注入宏.您可以导入宏with context,他们将访问导入模板的上下文.

{% from "macros/comments.html" import comment_form with context %}
Run Code Online (Sandbox Code Playgroud)