在Flask security中的宏中使用url_作为_安全性

在Flask security中的宏中使用url_作为_安全性,flask,flask-security,Flask,Flask Security,我试图在几个不同的地方重复使用我的flask安全登录表单,因此我将其定义为如下宏: {% macro loginForm(inForm) %} <form class="form-signin" action="{{ url_for_security('login') }}" method="POST" name="loginForm"> {{ inForm.hidden_tag() }} {{ renderFieldWithErrors(i

我试图在几个不同的地方重复使用我的flask安全登录表单,因此我将其定义为如下宏:

{% macro loginForm(inForm) %}
    <form class="form-signin" action="{{ url_for_security('login') }}" method="POST" name="loginForm">
        {{ inForm.hidden_tag() }}

        {{ renderFieldWithErrors(inForm.email, class="form-control top", placeholder="Login ID", required=True, autofocus=True) }}
        {{ renderFieldWithErrors(inForm.password, class="form-control bottom", placeholder="Password", required=True) }}

        <div class="checkbox">
            <label>
                {{ inForm.remember() }} Remember me
            </label>
        </div>
        <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>

        <p style="margin-top: 1em;"><a href="{{ url_for_security('forgot_password') }}">Trouble Logging In?</a></p>
    </form>
{% endmacro %}
{%macro loginForm(通知)%}
{{inForm.hidden_tag()}}
{{renderFieldWithErrors(inForm.email,class=“form control top”,placeholder=“Login ID”,required=True,autofocus=True)}
{{renderFieldWithErrors(inForm.password,class=“form control bottom”,placeholder=“password”,required=True)}
{{通知。记住()}}记住我
登录

{%endmacro%}

不幸的是,
url\u for\u security
在此上下文中未定义。如果我为将其更改为
url\u,它可以正常工作,但它会说
隐藏的标签
不存在。宏似乎没有定义与调用上下文相同的内容集。这可以纠正吗?谢谢。

默认情况下,宏与Jinja中的上下文一起导入:

默认情况下,包含的模板会传递到当前上下文,而导入的模板不会。原因是导入与include不同,是缓存的;as导入通常用作保存宏的模块

以及:

可以显式更改此行为:通过向import/include指令添加带上下文或不带上下文,可以将当前上下文传递给模板,并自动禁用缓存

我自己也遇到了这个问题,并通过更改在我的页面中导入宏的方式解决了这个问题:

{% import "security/_components.html" as components with context %}
请记住,这将禁用缓存机制,因此根据宏所做的操作,您可能会遇到性能问题(尽管我没有足够的经验来扩展这一点)


如果您想保留缓存,那么@stamaimer在其评论中提供的解决方案可以毫无问题地工作:
url\u for(“security.login”)
而不是
url\u for(“login”)
在宏中使用
url\u for(“security.login”)
?我终于弄明白了
url\u for()
和friends的工作原理,并且能够做我需要的事情。我想我真正的问题是如何将符号导入到宏中,但在默认情况下,我成功地用任何可用的方法完成了所有需要的操作。你能将你的方法作为问题的答案吗?这并不是对原始问题的回答,它与将符号导入宏有关。也许这和其他jinja模板中的“工作”一样?我还没试过。