2017-08-31 124 views
0

晚上好,網站未重定向到指定頁面登錄

我目前正試圖開發一個使用Python和Flask的網站。我發現了一些證明有用的資源,但是,當談到爲網站創建登錄信息時,我遇到了困難。

我有硬編碼邏輯來驗證用戶,如果成功將他們重定向到另一個頁面(儀表板),如果不成功,用戶將被提示嘗試再次登錄。出於某種原因,當我測試網站上的邏輯時,這些事情都不會發生。

正如你所看到的,我已經創建了一個style.css文件,但是我有興趣知道是否有更好的方法來使用Bootstrap實現相同的結果,我打算用它來爲網站的其餘部分使用。我不確定是否有將此文件中的樣式集成到引導框架的最佳做法。

此外,我一直在試圖使用閃存功能來顯示用戶名和密碼以進行測試,但是,一直無法使其工作。

任何幫助或見解將不勝感激。

的login.html

<link rel="stylesheet" href="/static/css/style.css" type="text/css"> 
{% block body %} 
{% if session['logged_in'] %} 
<p>You're logged in already!</p> 
{% else %} 


<form action="/login" method="POST"> 
    <div class="login"> 
     <div class="login-screen"> 
      <div class="app-title"> 
       <h1>Login</h1> 
      </div> 

      <div class="login-form"> 
       <div class="control-group"> 
        <input type="text" class="login-field" value="" placeholder="email address" name="email" value="{{request.form.email}}"> 
         <label class="login-field-icon fui-user" for="login-name"></label> 
       </div> 

       <div class="control-group"> 
        <input type="password" class="login-field" value="" placeholder="password" name="password" value="{{request.form.password}}"> 
         <label class="login-field-icon fui-lock" for="login-pass"></label> 
       </div> 

       <input type="submit" value="Log in" class="btn btn-primary btn-large btn-block" > 
        <br> 
      </div> 
     </div> 
    </div> 
</form> 

<p> {{error}} </p> 

{% endif %} 
{% endblock %} 

__init__.py

from flask import Flask, flash, redirect, render_template, request, session, abort, url_for 
import os 

app = Flask(__name__) 

@app.route('/') 
def home(): 
    if not session.get('logged_in'): 
     return render_template('login.html') 
    else: 
     return redirect(url_for('dashboard')) 

@app.route('/dashboard/') 
def dashboard(): 
    return ("dashboard.html") 

@app.route('/login/', methods=['GET','POST']) 
def do_admin_login(): 

    error = '' 
    try: 
     if request.method == "POST": 
      attempted_email = request.form['email'] 
      attempted_password = request.form['password'] 

      flash(attempted_email) 
      flash(attempted_password) 

      if attempted_password == 'password' and attempted_email == 'admin': 
       return redirect(url_for('dashboard')) 
      else: 
       error = "Invalid credentials. Please try again" 

     return render_template(login.html, error = error) 

    except Exception as e: 
      return render_template("login.html", error = error) 

@app.route("/logout/") 
def logout(): 
    session['logged_in'] = False 
    return home() 


if __name__ == "__main__": 
    app.run() 

的style.css

* { 
    box-sizing: border-box; 
} 

*:focus { 
    outline: none; 
} 
body { 
    font-family: Arial; 
    background-color: #D3600A; 
    padding: 50px; 
} 
.login { 
    margin: 20px auto; 
    width: 300px; 
} 
.login-screen { 
    background-color: #FFF; 
    padding: 20px; 
    border-radius: 5px 
} 

.app-title { 
    text-align: center; 
    color: #777; 
} 

.login-form { 
    text-align: center; 
} 
.control-group { 
    margin-bottom: 10px; 
} 

input { 
    text-align: center; 
    background-color: #ECF0F1; 
    border: 2px solid transparent; 
    border-radius: 3px; 
    font-size: 16px; 
    font-weight: 200; 
    padding: 10px 0; 
    width: 250px; 
    transition: border .5s; 
} 

input:focus { 
    border: 2px solid #D3600A; 
    box-shadow: none; 
} 

.btn { 
    border: 2px solid transparent; 
    background: #D3600A; 
    color: #ffffff; 
    font-size: 16px; 
    line-height: 25px; 
    padding: 10px 0; 
    text-decoration: none; 
    text-shadow: none; 
    border-radius: 3px; 
    box-shadow: none; 
    transition: 0.25s; 
    display: block; 
    width: 250px; 
    margin: 0 auto; 
} 

.btn:hover { 
    background-color: #2980B9; 
} 

.login-link { 
    font-size: 12px; 
    color: #444; 
    display: block; 
    margin-top: 12px; 
} 

回答

0

我有硬編碼的邏輯來驗證用戶,如果成功 重定向他們到另一個頁面(儀表板),如果不成功,用戶是 提示嘗試再次登錄。出於某種原因,當我測試網站上的邏輯時,這兩種情況都不會發生。

的問題很可能在你的縮進:

高清do_admin_login():

error = '' 
try: 
    if request.method == "POST": 
     attempted_email = request.form['email'] 
     attempted_password = request.form['password'] 

     flash(attempted_email) 
     flash(attempted_password) 

     if attempted_password == 'password' and attempted_email == 'admin': 
      return redirect(url_for('dashboard')) 
     else: 
      error = "Invalid credentials. Please try again" 
      return render_template('login.html', error = error) 

    return render_template('login.html') 

except Exception as e: 
     return render_template("login.html", error = error) 

第一return render_template時出現錯誤。第二個回報是當請求是GET而不是。也 注意你必須把引用您的模板在render_template

另外,我一直在試圖使用閃光燈功能 顯示用於測試目的的用戶名和密碼,但是,已經 一直無法得到這個工作。

據我所知,你應該通過一個字符串,而不是到flash 像這樣:'閃(「您已經登錄」)

正如你可以看到我已經創建了一個風格.css文件,但我想 有興趣知道是否有更好的方法來實現相同的 結果使用Bootstrap,我打算用於其餘的 網站。我不確定是否有將此文件中的 樣式集成到引導框架中的最佳做法。

您可以使用flask bootstrap

也:

def dashboard(): 
    return ("dashboard.html") 

應該是:

def dashboard(): 
    return render_template("dashboard.html") 

對於閃爍你的消息,嘗試這樣做,你返回之前。

if attempted_password == 'password' and attempted_email == 'admin': 
       flash(attempted_password) 
       flash(attempted_email) 
       return redirect(url_for('dashboard')) 
      else: 
       error = "Invalid credentials. Please try again" 
       return render_template(login.html, error = error) 
+0

嗨Mekicha。感謝您的貢獻和製作答案所花費的時間。當試圖實現建議1我的代碼錯誤說第19行的縮進是一個問題。我將代碼更改回原始縮進,問題已解決。關於建議2,我目睹了閃存被用來顯示變量的值,因此我的論點沒有被引用。我已經嘗試了編碼字符串,但是,這並沒有。解決這個問題。你有其他的意圖嗎? – user2337871

+0

在呈現模板之前嘗試使用flash',看看它給出了什麼。我更新了我的答案,以反映這種變化的外觀 – Mekicha