是否有人使用Flask-Security
扩展程序进行身份验证?如何使注册视图起作用?
http://packages.python.org/Flask-Security/customizing.html
我指的是上面的链接。
@app.route('/register', methods=['GET'])
def register():
return render_template('security/register_user.html')
我不想扩展默认类,我只想在我的网站布局中包装默认注册视图,所以我这样做了。
{% extends "layout.html" %}
{% block title %}upload{% endblock %}
{% block body %}
{% from "security/_macros.html" import render_field_with_errors, render_field %}
{% include "security/_messages.html" %}
<h1>Register</h1>
<form action="{{ url_for_security('register') }}" method="POST" name="register_user_form">
{{ register_user_form.hidden_tag() }}
{{ render_field_with_errors(register_user_form.email) }}
{{ render_field_with_errors(register_user_form.password) }}
{% if register_user_form.password_confirm %}
{{ render_field_with_errors(register_user_form.password_confirm) }}
{% endif %}
{{ render_field(register_user_form.submit) }}
</form>
{% include "security/_menu.html" %}
{% endblock %}
我收到以下错误?
werkzeug.routing.BuildError
BuildError: ('security.register', {}, None)
答案 0 :(得分:33)
您无需创建视图。 Flask-Security中包含默认值。 您只需要在烧瓶应用程序配置中启用它:
app = Flask(__name__)
app.config['SECURITY_REGISTERABLE'] = True
这样,'/ register'路线应该有效 如果需要,还有另一个配置值可以更改URL:
app.config['SECURITY_REGISTER_URL'] = '/create_account'
其他Flask-Security配置信息可在此处找到: http://pythonhosted.org/Flask-Security/configuration.html
答案 1 :(得分:0)
我还没有真正使用过Flask-Security,但是Builderror指的是flask不能将security.register视图绑定到URL。安全性是蓝图的名称。所以我建议您尝试按如下方式调用视图。而不是app.route,请使用security.route。
@security.route('/register', methods=['GET'])
def register():
return render_template('security/register_user.html')
答案 2 :(得分:0)
@dcr的答案很有帮助,但我想对此加以说明,并在此处和文档中明确指出一些仅隐含的内容。
Flask-Security带有默认视图(也称为路由)。可以使用-ABLE
配置变量来启用其中的许多功能,例如:
app.config["SECURITY_REGISTERABLE"] = True
您可以选择:启用并使用默认视图,或将其禁用,而使用您自己的视图。 启用视图后,便无法覆盖它。考虑它时,这是有道理的。如果您仅打算使用自己的实现,为什么要启用视图?烧瓶应该如何知道使用哪条路线?另一方面:如果视图被禁用,则其端点将不起作用。
如果您使用的是默认视图,则可以使用例如url_for('security.register')
(或旧风格的url_for_security('register')
)。 Flask-Security还将在security/TEMPLATE_NAME.html
中查找template,并使用它来显示表单(如果存在)。这使您可以进行视觉更改,并根据需要将表单包装在用户界面中。
因此,现在应该清楚为什么Werkzeug抱怨了。尝试在命令行上运行flask routes
,然后查看输出。您会看到类似这样的内容:
(venv) ⋊> ~/flaskapp on master ⨯ flask routes
Endpoint Methods Rule
-------------------------- --------- ------------------------------------------
index GET /
register GET /register
security.login GET, POST /login
security.logout GET /logout
[...]
请注意,security.register
端点不存在,因为您尚未打开REGISTERABLE
。因此url_for('security.register')
将失败。
您的视图没有做任何自定义,它仅显示模板。这就是@dcr正确地说您不需要创建视图的原因。让Flask-Security通过完全删除您的/register
路由并打开REGISTERABLE
为您做到这一点。因为您已经正确命名了register_user.html
模板,并将其放置在templates/security/
中,所以Flask-Security将使用它来以默认格式(或在安全性时提供的form)显示页面。对象是init
的对象。)
但是!如果您拥有的代码只是一个占位符,并且您需要在显示之前或当用户单击“提交”时以某种方式操纵表单或页面,那么您将需要自己的视图。在这种情况下,您应该不启用REGISTERABLE
,但这也意味着security.register
在url_for()
中将不可用。取而代之的是,您仅使用'register'
(如果注册代码在蓝图中,则仅使用'{bp_name}.register'
)。同样,您不需要特别为页面命名,因为您不必依赖其他人对该视图的实现。您可以将其放到模板文件夹中,并命名为register.html
。无论选择哪种路径,都需要在视图方法中将其传递给render_template()
。
感谢@drahoja9中的this answer,这终于使我明白了。