2016-07-04 1 views
-1

ユーザーがログインすると、ログインしていないという問題があります。ログインしたユーザーをリダイレクトするためのログインページに条件がありますしかし、それは動作していないようです。FlaskにSqlite3を使用してユーザーログイン(ログインマネージャー)を実装しようとしています

たとえば、ログイン後、ユーザーがログインページを再読み込みすると、再度ログインするように求められます。 @login_requiredを自分のルートに追加すると、不正なアクセスエラーが発生します。

私には何が欠けていますか?

ユーザークラス:

class User(UserMixin): 
    def __init__(self, username, password, email): 
     self.username = username.lower() 
     self.password = password 
     self.email = email 

    def is_authenticated(): 
     return True 

    def is_active(): 
     return True 

    def is_annonymous(): 
     return False 

    def get_id(self): 
     conn = connect_db() 
     conn.row_factory = sqlite3.Row 
     curs = conn.cursor() 
     curs.execute('select uid from user where username = (?)', [self.username]) 
     return unicode(curs.fetchone()) 

    def add_db(self): 
       curs = g.db.cursor() 
     curs.execute('insert into user(username, password, email) values (?, ?, ?)', [self.username, self.password, self.email]) 
     g.db.commit() 

再生回数:

@app.route('/login', methods = ['GET', 'POST']) 
    def login(): 
    print('testttttttttttttttttttttt' + str(g.user.get_id())) 
    if g.user is not None and g.user.is_authenticated: 
     return redirect(url_for('index'))  
    form = LoginForm() 
    if request.method == 'POST' and form.validate_on_submit(): 
     #session['remember_me'] = form.remember_me.data 
     g.username = form.username.data 
     g.password = form.password.data 
     user_db = fetch_user(g.username) 
     if user_db is not None: 
      if g.password == user_db[2]: 
       user = User(user_db[1], user_db[2], user_db[3]) 
       login_user(user, remember = form.remember_me.data) 
       flash('Login successful!') 
       return redirect(url_for('index')) 
      else: 
       flash('Incorrect password.') 
       return redirect(url_for('login')) 
     else: 
      flash('No such user exists.') 
      return redirect(url_for('login')) 
    return render_template('login.html', title = 'Sign In', form = form) 


    @lm.user_loader 
    def load_user(id): 
    conn = connect_db() 
    conn.row_factory = sqlite3.Row 
    curs = conn.cursor() 
    curs.execute('select * from user where uid = (?)', [id]) 
    return curs.fetchone() 

    @app.before_request 
    def before_request(): 
    g.db = connect_db() 
    g.user = current_user 

    @app.teardown_request 
    def teardown_request(error): 
    if hasattr(g, 'db'): 
     g.db.close() 


Let me know if I need to post some other part of my code. 

編集 - は、Userクラスのインスタンスを返すようにload_user方法を作ったが、今私は別のエラーを取得します。

コード - https://codeshare.io/svdIa

何らかの理由で、g.userとCURRENT_USERオブジェクトが 文字列ではなく、Userクラスのインスタンスとして認識されています。 login_userメソッドの最初の2行でも同じエラーが生成されます。

エラートレース:

File "C:\Python27\asset\flask\lib\site-packages\flask\app.py", line 2000, in __call__ 
return self.wsgi_app(environ, start_response) 
File "C:\Python27\asset\flask\lib\site-packages\flask\app.py", line 1991, in wsgi_app 
response = self.make_response(self.handle_exception(e)) 
File "C:\Python27\asset\flask\lib\site-packages\flask\app.py", line 1567, in handle_exception 
reraise(exc_type, exc_value, tb) 
File "C:\Python27\asset\flask\lib\site-packages\flask\app.py", line 1988, in wsgi_app 
response = self.full_dispatch_request() 
File "C:\Python27\asset\flask\lib\site-packages\flask\app.py", line 1641, in full_dispatch_request 
rv = self.handle_user_exception(e) 
File "C:\Python27\asset\flask\lib\site-packages\flask\app.py", line 1544, in handle_user_exception 
reraise(exc_type, exc_value, tb) 
File "C:\Python27\asset\flask\lib\site-packages\flask\app.py", line 1639, in full_dispatch_request 
rv = self.dispatch_request() 
File "C:\Python27\asset\flask\lib\site-packages\flask\app.py", line 1625, in dispatch_request 
return self.view_functions[rule.endpoint](**req.view_args) 
File "C:\Python27\asset\flask\lib\site-packages\flask_login.py", line 790, in decorated_view 
elif not current_user.is_authenticated: 
File "C:\Python27\asset\flask\lib\site-packages\werkzeug\local.py", line 343, in __getattr__ 
return getattr(self._get_current_object(), name) 
AttributeError: 'str' object has no attribute 'is_authenticated' 
+0

私はSqlite3でユーザーログインを実装するためにこの質問を参照しました - http://stackoverflow.com/questions/38177548/trying-to-implement-user-loginlogin-manager-with-sqlite3-in-flask –

答えて

0

あなたのアプリは、ユーザーに有効なログインするチェックしますクッキー(通常)または認可ヘッダーを設定する必要があります。

それ以外の場合は、ユーザーのブラウザにログインしていることをアプリケーションに伝える必要があります。アプリには、そのユーザーを有効にログインしたユーザーとして識別するものは何もありません。あなたの行で

login_user(user, remember = form.remember_me.data) 

は次のようになります。クッキーを設定

login_user(user, remember=True) 

。また、ログインの仕組みに基づいて、this answerとこの部分from the docsをご覧ください。

load_userは、return curs.fetchone()のようにカーソルがなくUserのインスタンスを返します。代わりに:

u = curs.fetchone() 
return User(u['username'], u['password'], u['email']) 

これは多くの情報がUserインスタンスを作成するために必要ではないので、これも間違っています。 idはプライマリキーと同じですか、それとも実際にはユーザー名ですか?

上記のドキュメントと答えをさらに読むことをお勧めします。

+0

ありがとう回答! しかし、その部分はLoginManagerによって処理されていませんか?もしそうでなければ、 'g.user = current_user'というステートメントの使い方は? –

+0

さらに詳しい情報を追加しました。ドキュメントを読む。 – aneroid

+0

私のIDは主キーであるuidフィールドです。私は提案された変更を加えましたが、別のエラーが発生しました。私の質問を更新しました。 load_userメソッドはUserクラスのget_idメソッドを呼び出して引数を取得します。 –

関連する問題