2017-03-14 5 views
0

SQLiteデータベースからユーザー名とパスワードフィールドを読み込み、基本的なHTTP認証(n cheack_auth関数)のユーザー入力値と比較しようとしています。私はretriveUser関数を使用してユーザーを取得し、それをテンプレートで表示することはできますが、フラスコアプリケーション内でそれを使用して、ユーザーが実際に存在するかどうかを比較することはできません。500 SQLite3データベース値との比較時にエラーが発生しました

thisによると、返されたdbuser内の項目に配列としてアクセスできるはずですが、動作していないようです。私はPythonの初心者なので、おそらく何か基本的なものが欠けているかもしれませんが、それが何であるか分かりません。

q = """ 
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    username TEXT NOT NULL, 
    password TEXT NOT NULL, 
    phone TEXT NOT NULL 
); 
""" 

con = sql.connect("database.db") 
cur = con.cursor() 
cur.execute(q) 

# original code from https://gist.github.com/PolBaladas/07bfcdefb5c1c57cdeb5 


def insertUser(username, password, phone): 
    con = sql.connect("database.db") 
    cur = con.cursor() 
    cur.execute("INSERT INTO users (username,password,phone) VALUES (?,?,?)", (username,password,phone)) 
    con.commit() 
    con.close() 

def retrieveUsers(): 
    con = sql.connect("database.db") 
    cur = con.cursor() 
    cur.execute("SELECT username, password, phone FROM users") 
    users = cur.fetchall() 
    con.close() 
    return users 

def retrieveUser(username): 
    con = sql.connect("database.db") 
    cur = con.cursor() 
    cur.execute("SELECT username, password FROM users WHERE username = (?)", [username]) 
    user = cur.fetchone() 
    con.close() 
    return user 

def check_auth(username, password): 
    """This function is called to check if a username/
    password combination is valid. 
    """ 
    dbuser = retrieveUser(username) 
    return username == dbuser[0] and password == dbuser[1] 

def authenticate(): 
    """Sends a 401 response that enables basic auth""" 
    return Response(
    'Could not verify your access level for that URL.\n' 
    'You have to login with proper credentials', 401, 
    {'WWW-Authenticate': 'Basic realm="Login Required"'}) 

def requires_auth(f): 
    @wraps(f) 
    def decorated(*args, **kwargs): 
     auth = request.authorization 
     if not auth or not check_auth(auth.username, auth.password): 
      return authenticate() 
     return f(*args, **kwargs) 
    return decorated 
+2

あなたは、Pythonから取得している実際のエラーが何である:ここでは

は私のcheck_authメソッドの結果のコードですか? 500状態は診断するにはあまりにもあいまいです。 –

+0

私はあなたにアリーを教えて欲しいです。これはクラスのためのもので、ドッカー、フラスコ、ガンコーンのスタックで走っています。私が限られたドッカー知識を得る方法を知っている最も多くのデバッグ情報は、ビルドプロセス中に発生するエラーのみを表示するドッカー作成ログからです。 – CNorlander

+0

私は 'docker'についてはあまりよく分かりませんが、[こちら](https://docs.docker.com/engine/reference/commandline/logs/)を試してみてください。 –

答えて

0

いいえ問題を解決したようです。ブラウザが古いパスワードのエントリをキャッシュしていたため、検索でnullが返されました。ユーザー検索関数から返された項目は、オブジェクトが見つかった場合にのみ配列として返され、そうでない場合はnullが返されます。次のコードでnullをチェックして問題を解決しました。

この問題の方向に私を指摘していた記録ログにアクセスする方法を理解するのを手伝ってくれたAllie Fitterに感謝します。

def check_auth(username, password): 
    """This function is called to check if a username/
    password combination is valid. 
    """ 
    dbuser = retrieveUser(username) 
    if dbuser is not None: 
     return username == dbuser[0] and password == dbuser[1] 
    return False 
関連する問題