首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Flask-Security寄存器视图?

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

Stack Overflow用户
提问于 2013-02-10 08:05:37
回答 3查看 11.9K关注 0票数 18

有人使用过Flask-Security扩展进行身份验证吗?如何让寄存器视图工作?

http://packages.python.org/Flask-Security/customizing.html

我指的是上面的链接。

代码语言:javascript
复制
 @app.route('/register', methods=['GET'])
 def register():
     return render_template('security/register_user.html')

我不想扩展默认类,我只想在我的站点布局中包装默认注册视图,所以我这样做了。

代码语言:javascript
复制
{% 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 %}

我得到了下面的错误?

代码语言:javascript
复制
werkzeug.routing.BuildError
BuildError: ('security.register', {}, None)
EN

回答 3

Stack Overflow用户

发布于 2013-02-24 15:07:53

您不需要创建视图。Flask-Security中包含一个默认设置。你只需要在你的flask应用配置中启用它:

代码语言:javascript
复制
app = Flask(__name__)
app.config['SECURITY_REGISTERABLE'] = True

这样,“/register”路由应该可以工作。

如果需要,还可以使用另一个配置值更改URL:

代码语言:javascript
复制
app.config['SECURITY_REGISTER_URL'] = '/create_account'

其它Flask-Security配置信息可在此处找到:http://pythonhosted.org/Flask-Security/configuration.html

票数 37
EN

Stack Overflow用户

发布于 2013-02-11 01:51:42

我并没有真正使用Flask-Security,但Builderror指的是flask不能将security.register视图绑定到URL的事实。安全性是蓝图的名称。因此,我建议您尝试调用视图,如下所示。使用security.route而不是app.route。

代码语言:javascript
复制
@security.route('/register', methods=['GET'])
def register():
    return render_template('security/register_user.html')
票数 0
EN

Stack Overflow用户

发布于 2019-04-26 19:26:45

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

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

代码语言:javascript
复制
app.config["SECURITY_REGISTERABLE"] = True

您可以选择:启用并使用默认视图、,将其禁用,然后使用您自己的视图。启用视图后,将无法覆盖该视图。仔细想想,这是有道理的。如果只计划使用自己的实现,为什么还要启用视图呢?flask应该如何知道要使用哪条路由?另一方面:如果视图被禁用,它的端点将不起作用。

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

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

代码语言:javascript
复制
(venv) ⋊> ~/flaskapp on master ⨯ flask routes
Endpoint                    Methods    Rule
--------------------------  ---------  ------------------------------------------
index                       GET        /
register                    GET        /register
security.login              GET, POST  /login
security.logout             GET        /logout
[...]

注意,因为您还没有打开REGISTERABLE,所以security.register端点并不存在。所以url_for('security.register')将会失败。

您的视图不执行任何自定义操作,它只显示模板。这就是为什么@dcr正确地说你不需要创建视图。让Flask-Security通过完全删除您的/register路由并打开REGISTERABLE来为您完成此操作。因为您已经正确地命名了register_user.html模板,并将其放置在templates/security/中,所以Flask-Security将使用它来显示带有默认表单的页面(或者在对安全对象进行init处理时您提供的任何form )。

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

感谢this answer中的@drahoja9,他终于让我明白了这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14793098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档