繁体   English   中英

Flask login_required + next url params

[英]Flask login_required + next url params

我的应用程序中有一个受保护的视图,它只接受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请求。 我可以解决这个问题,但我不知道如何从/booking检索原始的POST表单参数? 任何想法绕过那个?

我会通过拉取数据并将其放入会话中来解决这个问题。 您可以删除@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

为什么你只在预订视图中使用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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM