如何解决Flask POST重定向:参数显示在地址栏中
设置:
- Flask Web应用程序。
- 用户导航到多个页面之一[例如
game
页(localhost:5000/game
)或players
页(localhost:5000/players
)]中的请求,其形式为GAME_ID
。GAME_ID
用于获取其他详细信息并呈现页面。
目标:
- 当未经身份验证的用户向
/game
发出发布请求时,请将他们重定向到/login
页,但在会话中保留端点(game
)和GAME_ID
,这样,在成功登录后,我可以将其发送回他们正在访问的页面。我的方法是进行307重定向。
在application.py
@login_manager.unauthorized_handler
def intercept_unauthorized():
<Set NEXT_PAGE_FOR_REDIRECT and GAME_ID_FOR_REDIRECT into the session>
return redirect(url_for('login'))
@application.route("/login",methods=['GET','POST'])
def login():
#User sees the login page
if request.method=='GET':
<show the login page>
#User has submitted username and password on the login page
elif request.method=='POST':
<authentication code here>
if validUser:
#Get the page the user was trying to access e.g. 'game'
nextPage = session.get('NEXT_PAGE_FOR_REDIRECT')
session.pop('NEXT_PAGE_FOR_REDIRECT')
gameID = session.get('GAME_ID_FOR_REDIRECT')
session.pop('GAME_ID_FOR_REDIRECT')
return redirect(url_for(next_page,gameID=gameID),code=307)
@application.route("/game",methods=['POST'])
@login_required
def game():
if 'gameID' in request.form:
render_template('game.html',gameID=request.form['gameID'])
问题:
- 我能够重定向到
/game
为POST的request.method
。但是,request.form
中的数据是从login
页提交的数据,即用户名和密码。 - 我可以访问在
gameID
行中设置的url_for
,但是它是通过request.args
发送的(并且在浏览器的地址栏中可见),而不是通过{{ 1}}。
问题:
- 我使用重定向的方法正确吗?
- 如何修改发送到
request.form
的表单,以便可以向其中添加/game
?
解决方法
来自:https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/307
HTTP 307临时重定向重定向状态响应代码指示 所请求的资源已被临时移至URL 由Location标头给出。
原始请求的方法和主体被重复使用以执行 重定向的请求。在您想要使用该方法的情况下 更改为GET,请改用303请参阅其他。当您 想要对不是上载的PUT方法给出答案 资源,但出现一条确认消息(例如“您已成功上传 XYZ”)。
307和302之间的唯一区别是307确保 重定向时,方法和主体将保持不变 提出要求。
因此,保留了原始request.form
。您可以只使用session
来显示隐藏的ID,例如:
@application.route("/game",methods=['POST'])
@login_required
def game():
gameID = session.get('GAME_ID_FOR_REDIRECT')
session.pop('GAME_ID_FOR_REDIRECT')
render_template('game.html',gameID=gameID )
当然,您必须从pop()
删除login()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。