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は、flaskがsecurity.registerビューをURLにバインドできないという事実を参照しています。セキュリティは青写真の名前です。したがって、次のようにビューを呼び出すことをお勧めします。app.routeの代わりに、security.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 が正しく言っている理由です。/registerルートを完全に削除して をオンにすることで、Flask-Security がそれを実行しますREGISTERABLEregister_user.htmlテンプレートに適切な名前を付けてに配置したためtemplates/security/、Flask-Security はそれを使用して、既定のフォーム (またはセキュリティ オブジェクトが作成されたときに指定したフォーム) でページを表示ますinit

でも!そこにあるコードが単なるプレースホルダーであり、表示前またはユーザーが送信をクリックしたときに何らかの方法でフォームまたはページを操作する必要がある場合は、独自のビューが必要になります。この場合、 を有効にすべきではありませんが、これは で使用できないことREGISTERABLEも意味します。代わりに、just を使用します(または、登録コードがブループリントにある場合)。また、他の誰かのビューの実装に依存していないため、ページに特に名前を付ける必要はありません。テンプレートフォルダーに置いて、それを呼び出すことができます。どのパスを選択しても、それをビュー メソッドに渡す必要があります。security.registerurl_for()'register''{bp_name}.register'register.htmlrender_template()

この回答の@drahoja9に感謝します。最終的にこれを明確にしてくれました。

于 2019-04-26T11:26:44.617 に答える