Flask login_required + next url params

时间:2014-02-10 16:12:26

标签: python http flask http-redirect flask-login

我的应用中有一个受保护的视图,它只接受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形成参数?有什么想法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

我将通过提取数据并将其放入会话中来解决此问题。您可以删除@login_required装饰器,然后使用current_user.is_authorized在函数中进行检查。请参见Flask SessionsFlask 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')