2017-08-31 19 views
0

おはよう、ログイン時に特定のページにリダイレクトされないWebサイト

私は現在、PythonとFlaskを使用してウェブサイトを開発しようとしています。私は有用であると証明された多くのリソースを見つけましたが、Webサイトへのログインを作成する際には壁を打ちました。

私はユーザーを認証するためのハードコードされたロジックを持っており、成功した場合は別のページ(ダッシュボード)にリダイレクトし、失敗した場合は再度サインインを試みます。何らかの理由で、ウェブサイトのロジックをテストするときに、これらのことは起こりません。

私はstyle.cssファイルを作成しましたが、ブートストラップを使用して同じ結果を達成するより良い方法があるかどうかを知ることに興味があります。このファイル内のスタイルをブートストラップフレームワークに統合するためのベストプラクティスがあるかどうかはわかりません。

また、テスト目的でユーザー名とパスワードを表示するためにフラッシュ機能を使用しようとしていますが、これを動作させることができませんでした。

助力や洞察力があれば幸いです。

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です。 2回目のリターンは、リクエストがGETの場合です。 も注意してくださいあなたはまたrender_template

でテンプレートを引用配置する必要があり、私はしかし、 ができていない、 ディスプレイにフラッシュ機能をテスト目的のためにユーザー名とパスワードを使用しようとしてきましたどちらかを動作させる。あなたは私がスタイルを作成している見ることができるように `フラッシュ(「あなたはログインしてきた」)

私の知る限りでは、次のようにflash に代わりに文字列を渡す必要があります.cssファイルですが、 は、 サイトの残りの部分に使用する予定のブートストラップを使用して同じ結果を達成するより良い方法があるかどうかを知りたいと考えています。このファイル内の のスタイルをブートストラップフレームワークに統合するベストプラクティスがあるかどうかはわかりません。

また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

こんにちは。あなたの貢献と答えを工夫するのにかかる時間をありがとう。提案1を実装しようとすると、19行目のインデントが問題であるというコードエラーが発生します。コードを元のインデントに戻して、問題は解決されました。提案2に関して、私はflashが変数の値を表示するために使用されているのを目撃しました。なぜ私の引数が引用されていないのですか?私は文字列をハードコーディングしようとしましたが、これはしませんでした。問題を解決してください。他の通い口がありますか? – user2337871

+0

あなたのテンプレートをレンダリングする直前に「試してみてください。その変化がどのように見えるかを反映するために私の答えを更新しました – Mekicha

関連する問題