Flask 如何在登录成功后重定向到上一页

jas*_*jas 3 flask

我有一个不使用 Flask 登录的网络应用程序。如果用户访问链接但未登录,我会将用户重定向到登录页面。我在会话中实现了我的设置“用户名”,并检查当用户尝试直接访问某个链接而不登录时,即在这种情况下用户名将为空。

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

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)
Run Code Online (Sandbox Code Playgroud)

第二种解决方案

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

打印 (request.url) = localhost:5000/visitPage

登录功能

   if 'next' in request.args:
     return redirect(next)
   else:
     return redirect(url_for("user.index"))
Run Code Online (Sandbox Code Playgroud)

在这里,当我打印 (next) 时,它是 None
但是登录 url 有下一个参数

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

nas*_*pha 8

使用 session 来跟踪上一个 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'))
Run Code Online (Sandbox Code Playgroud)


the*_*dor 3

可能存在几个问题:

  • url_for如果查询参数具有 None 值,则跳过查询参数
  • 您的登录端点接受POST请求。在这种情况下,你必须next这样获取参数request.form.get('next')

如果这些提示对您没有帮助,您可以将import ipdb;ipdb.set_trace()(可能必须ipdb先安装)放入代码中并尝试对其进行调试,以便更好地理解这里发生的情况,或者添加更多上下文来理解您的问题。