12

要するに:

Flask マイクロ フレームワーク(およびその依存関係)のみを使用して、あるルートから別のルートへの内部リダイレクトを実行できますか?

例えば:

  1. ユーザーは登録フォーム (usernameとの両方password) を に送信します。@app.route('/register', methods=['POST'])
  2. 登録が成功すると、Flask は内部的に HTTP POST を実行し@app.route('/login', methods['POST'])usernamepassword
  3. ユーザーの処理とログイン

詳細:

FlaskFlask-JWT拡張機能を使用して REST API を構築しています。具体的には、ログインと登録を実装しています。

ログインは完全に機能し、トークンを含む JSON オブジェクトを返します。

以下は私の(ログイン)認証ハンドラーです(つまり/auth、(POSTリクエスト)-デフォルトのFlask-JWT認証URLルール):

@jwt.authentication_handler
def authenticate(username, password):
    user = User.query.filter_by(username=username).first()
    if user and user.verify_password(password):
        return user
    return None

ログインに成功すると、次が返されます。

{
  "token": "<jwt-token>"
}

以下は私の登録ルートです:

@app.route('/register', methods=['PUT'])
def register():
    username = request.form.get('username')
    password = request.form.get('password')
    if username is None or password is None:
        abort(400)  # missing parameters

    user = User.query.filter_by(username=username).first()
    if user:
        abort(400)  # user exists
    else:
        user = User(user=user)
        user.hash_password(password)
        db.session.add(user)
        db.session.commit()

        # How do we generate a token?
        # Perform an internal redirect to the login route?

    return jsonify({'token': <jwt-token>}), 201
4

1 に答える 1

8

Post-Redirect-Get パターンを使用する必要があります。

from flask import Flask, redirect, request, render_template
app = Flask("the_flask_module")

@app.route('/', methods=["GET", "POST"])
def post_redirect_get():
    if request.method == "GET":
        return render_template("post_redirect_get.html")
    else:
        # Use said data.
        return redirect("target", code=303)

@app.route("/target")
def target():
    return "I'm the redirected function"

app.run(host="0.0.0.0", port=5001)

そして、データをターゲット関数 (そのトークンなど) に渡したい場合は、セッション オブジェクトを使用してそれを保存できます。

それは次のようなものを分解します

@app.route('/register', methods=['PUT'])
def register():
    username = request.form.get('username')
    password = request.form.get('password')
    if username is None or password is None:
        abort(400)  # missing parameters

    user = User.query.filter_by(username=username).first()
    if user:
        abort(400)  # user exists
    else:
        user = User(user=user)
        user.hash_password(password)
        db.session.add(user)
        db.session.commit()

        # How do we generate a token?
        redirect("login_success", code=307)

@app.route("login_success", methods=["GET", "POST"])
@jwt_required()
def login_success():
    return "Redirected Success!"

編集: Flask-JWT を使用したことがなく、投稿の要件について知りませんでした。ただし、リダイレクト関数を渡すことcode=307で、(get リクエストではなく) 現在使用されているメソッドでリダイレクトするように Flask に指示できます. うまくいけば、それがあなたの拡張された問題を解決します。

于 2015-09-12T09:04:29.720 に答える