2017-01-08 16 views
3

をGET。私はpythonフラスコ、sqlite3とSQLiteのDBブラウザを使用しています。私はログイン部分に問題があります。PythonのフラスコPOST /私は私のウェブサイトでユーザー認証を支援する必要がある要求

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset = "UTF-8"/> 
    <title>PackageDrop Login</title> 
    <link type = "text/css" rel = "stylesheet" href="{{ url_for('static', filename='login.css') }}" /> 
    <link type = "text/css" rel = "stylesheet" href="{{ url_for('static', filename='cssmainpage.css') }}" /> 
    </head> 
    <body> 
    <form action="/login" method="POST" autocomplete="off"> 
    Username:<br> 
    <input type="text" name="username"> 
    <br> 
    Password:<br> 
    <input type="password" name="password"> 
    <br><br> 
    <input type="submit" value="Login"> 
    </body> 
</html> 

に転送されているページがあるだけのシンプルなHTML、何も特別な:私はHTMLのウェブサイトにログインし、リダイレクトしようとするたびに、それはここで

エラー404がログインページのためのコードであると言います私はそれをアップロードしていません。 あなたが理解するためにもっと多くの情報が必要と思われる場合は、尋ねてすぐに投稿します。 私はすべての助けをありがとう。

EDIT1: login.htmlフォームアクションを "login.html"から "login"に変更しました。これで、400 Bad Requestエラーが発生します。

EDIT2: リダイレクト作品。 "ProgrammingError:スレッドで作成されたSQLiteオブジェクトは、同じスレッドでのみ使用できます。オブジェクトはスレッドID 7812で作成されました。これはスレッドID 7388です"というログインエラーが発生しました。

@app.route('/login', methods=['GET', 'POST']) 
def login(): 
    error = None 
    checkP = conn.execute('select pword from users where uname = request.form[\'username\']') 
    arrayCheck = checkP.fetchall() 
    if request.method == 'POST': 
     if request.form['password'] != arrayCheck[[0][0]]: 
      error = 'Incorrect password' 
      return redirect(url_for('login.html')) 
     elif len(arrayCheck) == 0: 
      error = 'Username or password is incorrect' 
      return redirect(url_for('login.html')) 
     else: 
      session['logged_in'] = True 
      flash('You are logged in') 
      return redirect(url_for("userpage")) 
    return render_template('login.html') 
+1

再びあなたのロジックを見てください。ユーザー名とパスワードの値を自分と比較しています。 –

+0

@DanielRosemanしかし私は、ポストリクエストからユーザ名とパスワードをチェックして、それをデータベースのユーザ名とパスワードと比較しています。それはあなたがそれをする方法ではありませんか? – KatomPower

+1

あなたはそうではありません。あなたはそれをどこでやっていると思いますか?あなたは 'request.form'からユーザー名を取得し、それを' request.form ['username'] '、すなわちそれ自体に直接比較します。 –

答えて

1

のHttp 404コードがpage not foundを意味します。これは、ログインのための新しいコードで CONN = sqlite3.connect(「database.dbの」):私がやった唯一の事は、ちょうどこのようなデータベースに接続しています。フォームを投稿すると、リダイレクトはuserpage.htmlになりますが、フォームアクションは/loginになります。あなたの行動は、投稿が成功した後にリダイレクトするターゲットページでなければなりませんaction="/userpage"私はあなたがuserpageビュー機能を持っていると仮定します。または、リダイレクト機能redirect(url_for('userpage'))で試してみてください。注url_for()関数は、関数名にテンプレート名ではなくビュー名をとります。最後に私はあなたのログインロジックに注意を払わなかった。

+0

ログインは、ユーザー名とパスワードがデータベースにあるかどうかを確認するものです。私はそれを正しくしなかったことを理解しているので、どうすればいいのですか? – KatomPower

1
username = request.form['uname'] 
password = request.form['pword'] 
if request.form['uname'] != username: 
    error = 'Incorrect username' 
if request.form['pword'] != password: 
    error = 'Incorrect password' 

Daniel Rosemanはこのロジックに欠陥があると説明しました。あなたがする必要があるのは、ユーザが提供するpasswordとあなたのデータベースに保存したパスワードを比較することです。

擬似コードでは、このようになります:

username = request.form['uname'] 
password = request.form['pword'] 
try: 
    db_password = my_db.get('uname') 
    if password == db_password: 
     session['logged_in'] = True 
    else: 
     error = "Password provided does not match Database" 
except Exception as exc: 
    error = "Could not obtain password from Database : {}".format(exc) 

これは単なる最小、もちろんあなたはこれを改善することができています。

+0

助けてくれてありがとう。それはおそらく動作しますが、コピーするだけではなく、自分のやり方でやりたいのです。私は残念ながら私にエラーを与える新しいコードを投稿します。 – KatomPower

関連する問題