Flask内部重定向 [英] Internal Redirect in Flask

查看:150
本文介绍了Flask内部重定向的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

简而言之:

只有使用烧瓶微框架(及其依赖项),我们才能执行 内部重定向 从一条路线到另一条路线?

By only using the Flask micro-framework (and its dependencies) can we perform an internal redirect from one route to another?

例如:

  1. 用户向@app.route('/register', methods=['POST'])提交注册表单(usernamepassword)
  2. 如果注册成功,Flask将在内部对@app.route('/login', methods['POST'])进行HTTP POST,并传递usernamepassword
  3. 处理并登录用户
  1. User submits the registration form (both username and password) to @app.route('/register', methods=['POST'])
  2. If the registration is successful, Flask internally does an HTTP POST to @app.route('/login', methods['POST']) passing the username and password
  3. Process and log in the user


详细信息:

我正在使用 Flask

I am building a REST API using Flask and the Flask-JWT extension. More specifically I'm implementing the login and registration.

登录效果很好,并返回带有令牌的JSON对象.

Login works perfectly and returns a JSON object with a token.

以下是我的(登录)身份验证处理程序(即/auth(POST请求)-默认的Flask-JWT身份验证URL规则):

Following is my (login) authentication handler (i.e. /auth (POST request) - Default Flask-JWT authentication URL rule):

@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

推荐答案

您应该使用Post-Redirect-Get模式.

You should use the Post-Redirect-Get pattern.

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,也不知道职位要求.但是您可以通过

I haven't used Flask-JWT before and didn't know about the post requirement. But you can tell Flask to redirect with the current method used (rather than a get request) by passing the redirect function code=307.. Hopefully that solves your extended problem.

这篇关于Flask内部重定向的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆