如何使用Flask-Security寄存器视图?

时间:2013-02-10 00:05:37

标签: python flask flask-extensions flask-security

是否有人使用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)

3 个答案:

答案 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.registerurl_for()中将不可用。取而代之的是,您仅使用'register'(如果注册代码在蓝图中,则仅使用'{bp_name}.register')。同样,您不需要特别为页面命名,因为您不必依赖其他人对该视图的实现。您可以将其放到模板文件夹中,并命名为register.html。无论选择哪种路径,都需要在视图方法中将其传递给render_template()

感谢@drahoja9中的this answer,这终于使我明白了。