在Flask security中的宏中使用url_作为_安全性
我试图在几个不同的地方重复使用我的flask安全登录表单,因此我将其定义为如下宏:在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
{% 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模板中的“工作”一样?我还没试过。