我的应用中有一个受保护的视图,它只接受POST请求。
@app.route("/booking", methods=("POST", ))
@login_required
def booking():
arg1 = request.form.get("arg1")
arg2 = request.form.get("arg2")
当未经授权的用户尝试访问此视图时,我希望他们这样做 登录然后重定向到这里。
现在,我的登录视图如下所示:
@app.route("/login", methods=("GET", "POST"))
@login_required
def login():
do_login()
return redirect(request.args.get('next') or url_for('home'))
所以最终发生的是对/booking
的POST请求(这是
“下一个”参数)我得到一个NOT ALLOWED错误。
问题是login()
向booking()
发出GET请求。我可以
解决这个问题,但我不知道如何检索原始POST
从/booking
形成参数?有什么想法可以解决这个问题吗?
答案 0 :(得分:0)
我将通过提取数据并将其放入会话中来解决此问题。您可以删除@login_required装饰器,然后使用current_user.is_authorized
在函数中进行检查。请参见Flask Sessions和Flask Login。
类似的方法可能对您有用,但我没有对其进行测试:
from flask import session
from flask_login import current_user
@app.route("/booking", methods=("POST", ))
def booking():
if not 'arg1' in session.keys() and not 'arg2' in session.keys():
session['arg1'] = request.form.get("arg1")
session['arg2'] = request.form.get("arg2")
# Now the data will persist in the session
if current_user.is_authorized:
# Do what you need...
else:
# Redirect to login, session will persist
答案 1 :(得分:-1)
为什么您只在预订视图中使用POST?您可能正在渲染一个也应该允许GET的表单。
@app.route("/booking", methods=['GET','POST'])
@login_required
def booking():
# render the form. something like
form = BookingForm()
# Check if POST
if request.method == 'POST':
# process the form now and do whatever you need.
return redirect(url_for('index'))
# code below will run if not POST. You should render the template here
return render_templte('booking.html')