不能在jinja2宏中使用current_user?

时间:2014-10-13 12:04:01

标签: python flask jinja2

我使用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 %}

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

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

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

jinja2.exceptions.UndefinedError: 'current_user' is undefined

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

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

3 个答案:

答案 0 :(得分:15)

呈现模板的上下文不会传递给导入,除非指示这样做。请参阅relevant docs

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

{% from "macros/comments.html" import comment_form with context %}

答案 1 :(得分:1)

$('.bleu').click(function(e) { alert($(this).attr('id')); return false; }) 现在作为属性进行访问,调用方法定义将导致更新的库版本出现问题。

请参阅: https://flask-login.readthedocs.org/en/latest/#flask.ext.login.current_user

答案 2 :(得分:0)

更新:根据OP的要求,这是一个错误的答案。

根据jinja2 docs并非jinja2宏中的每个变量都可用。更改宏并将'current_user'作为参数发送给它:

% macro comment_form(form, current_user, disabled=False) %}
{% if current_user.is_authenticated() %}
  {{ quick_form(form) }}
{% else %}
  <p class="text-muted">You are not signed in. Please <a href="{{ url_for('auth.login') }}">Sign In With Github</a> to continue
  </p>
{% endif %}
{% endmacro %}

这就是你将如何使用它:

{% from "macros/comments.html" import comment_form %}
{% extends "base.html" %}
{% block content %}
  {# ... content goes here ... #}
  {{ comment_form(form, current_user) }}
{% endblock %}