2016-04-28 142 views
1

按下登錄按鈕後,它會將整個error.html文件打印到Web控制檯,而不是重定向到userhome.html,哪位出錯了,歡呼!代碼一切都低於...驗證用戶登錄

的Python:

@app.route('/ValidateLogin',methods=['POST']) 
def ValidateLogin(): 
    try: 
     _username = request.form['username'] 
     _password = request.form['password'] 

     #connection to MySQL 
     cur = mysql.connection.cursor() 
     cur.callproc('sp_validateLogin', (_username,)) 
     data = cur.fetchall() 

     if len(data) > 0: 
      if check_password_hash(str(data[0][3]), _password): 
       session['user'] = data[0][0] 
       return redirect('/UserHome') 
      else: 
       return render_template('error.html', error = 'Wrong Email Address or Password') 
     else: 
      return render_template('error.html', error = "Invalid Email Address or Password") 

    except Exception as e: 
     return render_template('error.html', error = str(e)) 
    finally: 
     cur.close() 

JS:

$(function() { 
    $('#btnSignIn').click(function() { 
     $.ajax({ 
      url: '/ValidateLogin', 
      data: $('form').serialize(), 
      type: 'POST', 
      success: function(response) { 
       console.log(response); 
      }, 
      error: function(error) { 
       console.log(error); 
      } 
     }); 
    }); 
}); 

回答

0

當正確的用戶憑據被輸入它重定向到/UserHome

您可以通過查看請求日誌,這將是這個樣子確認:

 
127.0.0.1 - - [28/Apr/2016 22:27:59] "POST /ValidateLogin HTTP/1.1" 302 - 
127.0.0.1 - - [28/Apr/2016 22:27:59] "GET /UserHome HTTP/1.1" 200 - 

你可以看到POST請求向$.ajax()產生/ValidateLogin是迴應以302重定向到/UserHome哪些然後跟着$.ajax()。這是自動發生的,所以你的javascript沒有機會在重定向上採取行動。

參考this answer,一種解決方案是讓您的服務器發送一個JSON響應,其中包含要在登錄成功時重定向到的「位置」URL。然後讓你的success()處理程序重定向瀏覽器window.location.replace(location)

如果登錄不成功然後從error.html模板呈現的HTML可以在不同的JSON項目,其中success()處理程序(因爲你現在應該總是得到一個200響應)用來設置文件內容被退回。查看參考答案,瞭解如何在客戶端處理它的一些代碼。

+0

感謝您的答案,但我找出了爲什麼它不工作的原因。密碼被散列,然後變量大小太小而無法在數據庫中保存散列密碼,導致它始終顯示錯誤頁面! – Yatestom

+0

@Yatestom:真的嗎?這不是你最初描述的問題,但我注意到你已經更新了你的問題。無論您是否仍然遇到上面描述的$ .ajax()重定向問題,瀏覽器都不會重定向到所需的頁面。你修改你的JavaScript來處理它嗎? – mhawke