18

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

3 回答 3

37

您不需要创建视图。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

于 2013-02-24T07:07:53.463 回答
0

我并没有真正使用过 Flask-Security,但 Builderror 指的是烧瓶无法将 security.register 视图绑定到 URL 的事实。安全是蓝图的名称。所以我建议你尝试如下调用视图。使用 security.route 代替 app.route。

@security.route('/register', methods=['GET'])
def register():
    return render_template('security/register_user.html')
于 2013-02-10T17:51:42.143 回答
0

@dcr 的回答很有帮助,但我想稍微澄清一下,并明确一些仅在此处和文档中隐含的内容。

Flask-Security 带有默认视图(也称为路由)。其中许多可以使用-ABLE配置变量启用,如下所示:

app.config["SECURITY_REGISTERABLE"] = True

您可以选择:启用并使用默认视图,或者将其禁用并使用您自己的视图。启用视图后,您将无法覆盖它。当您考虑它时,这是有道理的。如果您只是打算使用自己的实现,为什么要启用视图?烧瓶应该如何知道使用哪条路线?另一方面:如果视图被禁用,它的端点将不起作用。

如果您使用的是默认视图,那么您可以使用 eg url_for('security.register')(或url_for_security('register')旧样式)为其创建 URL。Flask-Security 还将在其中查找模板security/TEMPLATE_NAME.html并使用它来显示表单(如果存在)。这允许您进行视觉更改并根据需要将表单包装在 UI 中。

所以,现在应该清楚 Werkzeug 抱怨的原因了。尝试flask routes在命令行上运行,并查看输出。你会看到这样的东西:

(venv) ⋊&gt; ~/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 将使用它以默认形式(或您在安全对象被'ed时提供的任何形式)显示页面。init

然而!如果您拥有的代码只是一个占位符,并且您需要在显示之前或当用户单击提交时以某种方式操作表单或页面,那么您将需要自己的视图。在这种情况下,您不应该启用REGISTERABLE但这也意味着security.register您将无法在url_for(). 相反,您将只使用'register'(或者'{bp_name}.register'如果您的注册码在蓝图中)。此外,您不需要特别为您的页面命名,因为您不依赖于其他人的视图实现。你可以把它放在你的模板文件夹中并调用它register.html。无论您选择什么路径,您都需要将其传递给render_template()您的视图方法。

感谢@drahoja9这个答案中终于让我明白了这一点。

于 2019-04-26T11:26:44.617 回答