12

简而言之:

通过仅使用Flask 微框架(及其依赖项),我们可以执行从一条路由到另一条路由的内部重定向吗?

例如:

  1. 用户提交注册表(usernamepassword)提交给@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,也不知道 post 要求。但是你可以通过传递 redirect functioncode=307来告诉 Flask 使用当前使用的方法(而不是 get 请求)进行重定向. 希望这可以解决您的扩展问题。

于 2015-09-12T09:04:29.720 回答