Flask 中的内部重定向
Internal Redirect in Flask
简而言之:
通过仅使用 Flask micro-framework(及其依赖项),我们可以执行从一条路线到另一条路线的 内部重定向 ?
例如:
- 用户将注册表(
username
和password
)提交给@app.route('/register', methods=['POST'])
- 如果注册成功,Flask 在内部执行 HTTP POST 到
@app.route('/login', methods['POST'])
传递 username
和 password
- 处理并登录用户
详情:
我正在使用 Flask and the Flask-JWT 扩展构建 REST API。更具体地说,我正在实施登录和注册。
登录完美无缺,returns 一个带有令牌的 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
登录成功returns:
{
"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 模式。
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)
And if you want to pass data to the target function (like that token) you can use the session object to store it
所以这会分解像
@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 的要求。但是你可以通过 passing the redirect function code=307
. 告诉 Flask 使用当前使用的方法(而不是 get 请求)重定向。希望这能解决您的扩展问题。
简而言之:
通过仅使用 Flask micro-framework(及其依赖项),我们可以执行从一条路线到另一条路线的 内部重定向 ?
例如:
- 用户将注册表(
username
和password
)提交给@app.route('/register', methods=['POST'])
- 如果注册成功,Flask 在内部执行 HTTP POST 到
@app.route('/login', methods['POST'])
传递username
和password
- 处理并登录用户
详情:
我正在使用 Flask and the Flask-JWT 扩展构建 REST API。更具体地说,我正在实施登录和注册。
登录完美无缺,returns 一个带有令牌的 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
登录成功returns:
{
"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 模式。
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)
And if you want to pass data to the target function (like that token) you can use the session object to store it
所以这会分解像
@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 的要求。但是你可以通过 passing the redirect function code=307
. 告诉 Flask 使用当前使用的方法(而不是 get 请求)重定向。希望这能解决您的扩展问题。