2012-02-01 6 views
8

私は認証が必要なフラスコのアプリケーションに取り組んでいます。私はフラスコログインを接続しましたが、それは非常に優雅に見えません。フラスコを使用する - postgresqlでログイン

まずフラスコ-ログインはユーザーが存在することを確認する必要があります。

@login_manager.user_loader 
def load_user(id): 
    return User.query.get(id) 

しかし、あなたはまた、「ユーザー上記のコードでは、ユーザオブジェクト

# Some code above 
    user = User.query.filter_by(email = form.email.data, password = form.password.data).first() 
    user.login_status = 1 
    db.session.commit() 
    login_user(objects.SignedInUser(user.id, user.email, user.login_status == LoginStatus.Active))  
# Some code below 

を作成するために、「LOGIN_USER」を使用する必要があります'はpostgresのモデルであり、SignedInUserはフラスコログインに使用される単なるオブジェクトです。

postgresでフラスコログインの例がありますか?

答えて

35

Flask-Loginが扱うものを誤解しているようです。 user_loaderコールバックは、誰かに再接続したときなど、すでに認証されているユーザーのオブジェクトを再読み込みする方法のみを示します(login_userを呼び出すことによって)認証が成功したことを通知した後で、 「私を覚えている」セッション。ドキュメントでは特に明確ではありません。

ユーザーのログイン状態のためにデータベースにフラグを保持する必要はありません。また、資格情報が間違っている場合(User = None)、含まれているコードはAttributeErrorを発生させます。

Flask-SQLAlchemyアプリケーションの例です。外部認証ソースとSQLAlchemy Userオブジェクトのラッパーを使用しますが、プロセスは基本的に同じです。

user_loaderコールバック:

@login_manager.user_loader 
def load_user(user_id): 
    user = User.query.get(user_id) 
    if user: 
     return DbUser(user) 
    else: 
     return None 

Userクラス(SQLAlchemyのオブジェクトのラッパー):

# User class 
class DbUser(object): 
    """Wraps User object for Flask-Login""" 
    def __init__(self, user): 
     self._user = user 

    def get_id(self): 
     return unicode(self._user.id) 

    def is_active(self): 
     return self._user.enabled 

    def is_anonymous(self): 
     return False 

    def is_authenticated(self): 
     return True 

ログインハンドラ:

@app.route('/login', methods=['GET', 'POST']) 
def login(): 
    error = None 
    next = request.args.get('next') 
    if request.method == 'POST': 
     username = request.form['username'] 
     password = request.form['password'] 


     if authenticate(app.config['AUTH_SERVER'], username, password): 
      user = User.query.filter_by(username=username).first() 
      if user: 
       if login_user(DbUser(user)): 
        # do stuff 
        flash("You have logged in") 

        return redirect(next or url_for('index', error=error)) 
     error = "Login failed" 
    return render_template('login.html', login=True, next=next, error=error) 

注ログイン失敗した場合:

  • 外部認証は
  • ユーザーのクエリを使用すると、ログアウト方法について@login_requiredを必要なし(ユーザーが存在しない)偽
  • login_userリターン(user.is_active() == False

ログアウト

@app.route('/logout') 
@login_required 
def logout(): 
    logout_user() 
    flash('You have logged out') 
    return(redirect(url_for('login'))) 
+1

を返さない –

+1

失敗します私はログアウトに追加しました –

+0

"login_user(DbUser(user)):#do stuff"の場合、どんな種類のものがありますか? – Mittenchops