瓶颈成功登录后如何重定向到上一页

问题描述:

我有一个web应用程序,我不使用Flask登录。如果用户访问链接并且未登录,我将用户重定向到登录页面。我在会话中实现了我的设置“用户名”,并检查用户是否尝试直接访问某个链接而不登录,即在这种情况下,用户名将为空。瓶颈成功登录后如何重定向到上一页

我试图遵循这个 SO solution,但下一个参数总是无。我已经尝试了两种解决方案,但无法让任何一个人工作。

username = session.get('username') 
if username: 
    # go to home 
else: 
    next_url = request.url 
    login_url = '%s?next=%s' % (url_for('login'), next_url) 
    return redirect(login_url) 

第二溶液

username = session.get('username') 
if username: 
    # go to home 
else: 
    return redirect(url_for('login', next= request.url)) 

打印(request.url)=本地主机:5000/visitPage

登录功能

if 'next' in request.args: 
    return redirect(next) 
    else: 
    return redirect(url_for("user.index")) 

在这里当我打印(下一个),它是无
但登录网址有下一个参数

http://localhost:5000/login?next=http%3A%2F%2Flocalhost%3A5000%2FvisitPage

+0

放在这里,从第二个解决方案打印出来request.url的。如果它没有,'url_for'跳过它,并不通过查询参数 – theodor

+0

我已经包括了打印。在请求和url本身有下一个请求之前,它不是request.url,而是为什么它是空的?我下一次检查的方式有什么问题吗? – jas

+0

是你登录函数处理程序接受GET还是POST方法?如果它是POST,你应该检查request.form.get('next') – theodor

可能有几个问题:

  • url_for跳过,如果它有没有价值
  • 登录端点需要POST请求查询参数。在这种情况下,你必须得到next PARAM这样的方式request.form.get('next')

如果这些建议不帮你,你可以把import ipdb;ipdb.set_trace()(可能是你必须安装ipdb第一)在你的代码,并尝试调试它更好地理解这里发生的事情,或者放置更多的上下文来理解你的问题。

+0

问题在登录功能。如果表单数据无效,登录func会进行表单验证并重定向用户。所以,在这种情况下,首先调用登录函数导致重定向,并且下一个数据在第二次请求时消失。必须保存两个请求之间的下一个数据,一切正常。 – jas

使用会话跟踪以前的url, 例如:

@app.route('/profile') 
def profile(): 
    if user_not_logged_in: 
     session['url'] = url_for('profile') 
     return redirect(url_for('login')) 
    return rendertemplate('profile.html') 

@app.route('/login') 
def login(): 
    if login == True: #assuming login was successful 
     if 'url' in session: 
      return redirect(session['url']) 
     return redirect(url_for('anyother_url'))