当前位置: 首页 > 面试题库 >

不能在jinja2宏中使用current_user?

牧献
2023-03-14
问题内容

我使用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)。

宏为什么不使用上下文处理器?它不包含上下文吗?


问题答案:

没错,你不需要将上下文作为宏的参数。你可以导入宏with context,它们将可以访问其导入模板的上下文。

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


 类似资料:
  • 问题内容: 我想在我的Flask应用程序中包含一个sass编译器。有一种普遍接受的方法吗? 问题答案: Flask-Assets扩展(使用webassets库)可以用于此目的。以下是将其配置为使用SCSS的pyScss编译器(在Python中实现)的方法: 并在模板中包括以下内容: SCSS文件也将在调试模式下进行编译。 pyScss只支持SCSS语法,但也有其他过滤器(,和)使用原始的Ruby实

  • 问题内容: 我必须遵循以下方案: python字典的python列表列表中的 每个元素都是一个python字典,看起来像这样: 现在,我希望所有字典作为主模板中的列表。但是,每个词典的内容应由子模板呈现。应使用哪种模板来呈现内容,应由字典的type变量定义。 关于使用Jinja2如何完成此操作的任何提示(如果有帮助,我正在通过Flask使用它。) 谢谢! 问题答案: 如果有人需要它: 然后可以在模

  • 问题内容: 我在Linux内核代码中遇到了这两个宏。我知道它们是编译器(gcc)进行分支优化的指令。我的问题是,我们可以在用户空间代码中使用这些宏吗?会进行任何优化吗?任何示例都将非常有帮助。 问题答案: 是的他们可以。在Linux内核中,它们被定义为 __builtin_expect宏是使用分支预测的特定于GCC的宏;它们告诉处理器条件是否可能为真,以便处理器可以在分支的正确“侧”上预取指令。

  • 问题内容: 我从Flask的Jinja2模板提供动态页面。现在,我在脚本标签内定义客户端模板,例如Jinja2克隆Nunjucks。问题是,客户端模板具有类似语法该Flask’s的 Jinja2的解释,而不是可以解释渲染的逐字。 如何使整个脚本块逐字呈现? 问题答案: 你可以禁用块内标签的解释:

  • 问题内容: 在Java for Eclipse中开发时,是否可以使用m4宏,即。确保在Eclipse编译之前自动调用预处理器? 还是有人在Eclipse中成功使用了另一个预处理器? 问题答案: 您可以在Eclipse项目上指定一个任意的构建器,并对其进行排序,以便在运行Java构建器之前执行该构建器。 要定义新的构建器,请打开项目属性(右键单击- > Properties或- ),选择“ 构建器”

  • 问题内容: 我在Jinja2中进行代码生成,我经常想一起遍历两个列表(即变量名称和类型),有没有简单的方法可以做到这一点,或者我只需要传递一个预压缩的列表?我在文档或谷歌搜索中找不到这样的功能。 问题答案: 如果认为合适,请修改jinja2.Environment全局名称空间本身。 这可能有助于将视图(模板)逻辑与应用程序逻辑分离,但也可以实现相反的效果。#关注点分离