2017-02-16 237 views
0

我有一個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

回答

0

可能有幾個問題:

  • url_for跳過,如果它有沒有價值
  • 登錄端點需要POST請求查詢參數。在這種情況下,你必須得到next PARAM這樣的方式request.form.get('next')

如果這些建議不幫你,你可以把import ipdb;ipdb.set_trace()(可能是你必須安裝ipdb第一)在你的代碼,並嘗試調試它更好地理解這裏發生的事情,或者放置更多的上下文來理解你的問題。

+0

問題在登錄功能。如果表單數據無效,登錄func會進行表單驗證並重定向用戶。所以,在這種情況下,首先調用登錄函數導致重定向,並且下一個數據在第二次請求時消失。必須保存兩個請求之間的下一個數據,一切正常。 – jas

0

使用會話跟蹤以前的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'))