Python 如何使用Flask安全注册表视图?

Python 如何使用Flask安全注册表视图?,python,flask,flask-extensions,flask-security,Python,Flask,Flask Extensions,Flask Security,是否有人使用Flask Security扩展进行身份验证?如何让注册视图工作 我指的是上面的链接 @app.route('/register', methods=['GET']) def register(): return render_template('security/register_user.html') 我不想扩展默认类,我只想在我的站点布局中包装默认注册视图,所以我这样做了 {% extends "layout.html" %} {% block title %

是否有人使用
Flask Security
扩展进行身份验证?如何让注册视图工作

我指的是上面的链接

 @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 %}

我没有真正使用过Flask安全性,但Builderror指的是Flask无法将Security.register视图绑定到URL。安全是蓝图的名称。因此,我建议你试着把这种观点称为如下观点。使用security.route代替app.route

@security.route('/register', methods=['GET'])
def register():
    return render_template('security/register_user.html')

您不需要创建视图。默认值包含在Flask Security中。 您只需在flask应用程序配置中启用它:

app = Flask(__name__)
app.config['SECURITY_REGISTERABLE'] = True
这样,“/register”路由就可以工作了。
如果需要,还有另一个配置值可以更改URL:

app.config['SECURITY_REGISTER_URL'] = '/create_account'
其他烧瓶安全配置信息可在此处找到:
来自@dcr的答案很有帮助,但我想澄清一下,并明确说明一些仅在此处和文档中暗示的内容

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

app.config["SECURITY_REGISTERABLE"] = True
您可以选择:启用并使用默认视图,将其禁用并使用您自己的视图。启用视图时,不能覆盖它。仔细想想,这是有道理的。如果只是计划使用自己的实现,为什么要启用视图?你怎么知道该走哪条路?另一方面:如果视图被禁用,其端点将无法工作

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

所以,现在应该清楚Werkzeug为什么抱怨了。尝试在命令行上运行
flaskroutes
,并查看输出。您将看到如下内容:

(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
。因此('security.register')的
url\u将失败

您的视图不做任何自定义操作,它只显示模板。这就是@dcr正确地说您不需要创建视图的原因。通过完全删除
/register
路由并打开
REGISTERABLE
,让Flask Security为您做到这一点。因为您已经正确地命名了
register\u user.html
模板,并将其放置在
templates/security/
中,Flask security将使用它以默认形式显示页面(或者在安全对象初始化时提供的任何内容)

然而!如果您拥有的代码只是一个占位符,并且您需要在显示之前或当用户单击提交时以某种方式操纵表单或页面,那么您将需要自己的视图。在这种情况下,您不应该启用
可注册的
,但这也意味着
安全性.register
将不可用于
url\u for()
。相反,您将只使用
'register'
(或者
'{bp\u name}.register'
,如果您的注册码在蓝图中)。此外,您不需要为页面命名任何特定的名称,因为您不依赖其他人的视图实现。您可以将其放在templates文件夹中,并将其命名为
register.html
。无论选择什么路径,都需要将其传递到视图方法中的
render\u template()


感谢in,他终于让我明白了这一点。

可能是你在这里发布时的一个输入错误,但是你的查看功能被输入为“regsiter”而不是“register”。很抱歉,这只是我在这里写的一个输入错误……不走运,它给了我TypeError:“NoneType”对象是不可调用的这对我来说是一个无限递归的失败。这个答案帮助我使表单工作,但是对于像我这样的完整的Flask和Python新手来说:你必须首先在你的应用程序中初始化安全性。请看这里:我试图启用/register/endpoint,但它从未起作用,因为我从未初始化过我的安全实例。感谢您提供的解决方案。这解决了我的问题,但我收到了不同的错误消息。我会把它放在这里,以防它对未来的谷歌用户有所帮助——希望能节省我在追踪这件事上浪费的时间。。。werkzeug.routing.BuildError:无法为端点“security.register”生成URL,您的意思是“security.login”吗?
(venv) ⋊> ~/flaskapp on master ⨯ flask routes
Endpoint                    Methods    Rule
--------------------------  ---------  ------------------------------------------
index                       GET        /
register                    GET        /register
security.login              GET, POST  /login
security.logout             GET        /logout
[...]