2012-08-22 10 views
53

私はどのように理解しようとしていますFlask-Loginフラスコログイン:どのように動作するのか分からない

マニュアルには、事前に入力されたユーザーリストが使用されています。データベースに保存されたユーザーのリストを再生したい。

しかし、私はこのFlask-Loginモジュールでいくつかのことを理解していません。

@login_manager.user_loader 
def load_user(userid): 
    #print 'this is executed',userid 
    return user(userid, 'asdf') 

このコードはすべてのリクエストで呼び出されますか?これは、私のユーザーオブジェクトのすべての詳細をロードするために使用されますか?

今のところ、私はこのコードを持っている:私は/メイクログインアクセスすると

@app.route('/make-login') 
def make_login(): 
    username = 'asdf' 
    password = 'asdf' 
    user_data = authenticate(username, password) 
    user_obj = user(user_data[0], user_data[1]) 
    login_user(user_obj) 
    return render_template('make-login.html') 

、私は、ログインしたい

私のユーザークラス:また

class user(object): 
    def __init__(self, id, username, active=True): 
     self.username = username 
     self.id = id 
     #self.active = active 
    def is_authenticated(self): 
     return True 

    def is_active(self): 
     return True 

    def is_anonymous(self): 
     return False 

    def get_id(self): 
     return 5 

、私は認証/登録のための別の2つの機能を書いた。

def authenticate(username, password): 

    cursor = db.cursor() 
    password = md5.md5(password).hexdigest() 
    try: 
     query = "SELECT * FROM `users` WHERE `username` = %s AND `password` = %s" 
     cursor.execute(query, (username, password)) 
     results = cursor.fetchall() 
     #print results[0][0] 
     #print "here i am" 
     if not results: 
      return False 
     else: 
      user_data = [results[0][0], results[0][1]] 
      return user_data 
      #self.authenticated = True 
      #self.user_id = results[0][0] 
      #session['username'] = results['username'] 
      #print type(results) 
    except db.Error, e: 
     return 'There was a mysql error'  

def register(username, password, email, *args): 
    cursor = db.cursor() 
    password = md5.md5(password).hexdigest() 
    try: 
     #query = "INSERT INTO `users` (`username`, `password`, `email`) VALUES ('%s', '%s', '%s')" % (username, password, email) 
     query = "INSERT INTO `users` (`username`, `password`, `email`) VALUES (%s, %s, %s)" 
     cursor.execute(query, (username, password, email)) 
     db.commit() 
     return True 
    except db.Error, e: 
     print 'An error has been passed. %s' %e 
     db.rollback() 
     return False 

Flask-LoginをMySQLで動作させる方法を知りません。また、私はユーザーがログインしているかわからない。ユーザーIDまたはユーザー名はどのように取得できますか?

誰かが私にこの行をどのように説明できますかFlask-Login

答えて

49

フラスコログインが実際にユーザーのバックエンドを持っていない、それはちょうどあなたがログインおよびログアウトのユーザーを支援するために、セッションの機械を扱います。あなたは(メソッドを装飾することによって)それを伝えなければなりません。それはユーザーを表現するものであり、ユーザーが「アクティブ」であるかどうかを知る方法を理解することです(「アクティブ」は異なるアプリケーション)。

documentationをよく読んで、の内容を確認し、を実行しないでください。ここでは、dbバックエンドとの配線に専念するつもりです。

まず、ユーザーオブジェクトを定義します。これはユーザーのプロパティを表します。このオブジェクトはデータベースやLDAPなどのクエリを実行でき、ログイン機構とデータベースのバックエンドを接続するフックです。

私はこの目的のためにlogin exampleスクリプトを使用します。

class User(UserMixin): 
    def __init__(self, name, id, active=True): 
     self.name = name 
     self.id = id 
     self.active = active 

    def is_active(self): 
     # Here you should write whatever the code is 
     # that checks the database if your user is active 
     return self.active 

    def is_anonymous(self): 
     return False 

    def is_authenticated(self): 
     return True 

作成したユーザーオブジェクトを持っていたら、あなたは利用者(基本的には、上からUserクラスのインスタンスを作成します)をロードする方法を記述する必要があります。このメソッドは、ユーザーIDとともに呼び出されます。これらの手順を持っていたら

@login_manager.user_loader 
def load_user(id): 
    # 1. Fetch against the database a user by `id` 
    # 2. Create a new object of `User` class and return it. 
    u = DBUsers.query.get(id) 
    return User(u.name,u.id,u.active) 

、ログイン方法は、この行います(データベースに対して)ユーザー名とパスワードの一致があれば

  1. どうかを確認するために - あなたはこのコードを自分で記述する必要があります。認証が成功した場合

  2. 、ユーザーのIDを取得し、試してみて、すべての要求する前にユーザーをロードしますlogin_user()

+12

+1これは非常に役に立ちました---私は公式のFlask-Loginのドキュメントをよく理解していませんでした。 – Raj

+0

リンク先の要点は、これをテストするためにデータベースのバックエンドを設定したくない場合に特に役立ちます。https://gist.github.com/bkdinoop/6698956 – dino

+0

@Burhan Khalid、サンプル関数では、 def login():... login_user(user)。ユーザーはどこから来たのですか? – chfw

0

ここでは、ログインを使用するFlaskの例を示します。https://bitbucket.org/leafstorm/flask-login/src/3160dbfc7cfc/example/login-example.pyログインが必要なすべてのメソッドに@login_requiredを使用する必要があります。例えば、

@app.route('/make-login') 
@login_required 
def make_login(): 
    ... 
+0

私はlogin_requiredが何であるかを知っています。私はuser_loaderの内容を知る必要があります。しかし、私はこの例を知っていますが、彼らはデータベースからユーザーを管理していません... –

+3

とリンクは、少なくとも私のために拒否されました。 – volvox

10

フラスコログインにそれを渡します。したがって、以下のサンプルコードはすべてのリクエストの前に呼び出されます。これは、現在のセッションにあるユーザIDを確認するために使用され、そのIDのユーザオブジェクトをロードします。

app.before_request(self._load_user) 

をだから、すべての要求の前に、_load_user関数が呼び出されます:あなたはgithubの上のフラスコログインソースコードを見れば

@login_manager.user_loader 
def load_user(userid): 
    #print 'this is executed',userid 
    return user(userid, 'asdf')   

、行く機能init_app下のラインがあります。 _load_user関数は実際には条件に基づいて別の関数 "reload_user()"を呼び出します。最後に、reload_user()関数は、あなたが書いたコールバック関数(あなたの例ではload_user())を呼び出します。

また、フラスコログインは、ユーザーのログイン/ログアウトのメカニズムのみを提供します。 mysqlデータベースを使用している場合は気にしません。

3

Flask-Loginのドキュメントによると、ユーザーオブジェクトが返されなければならず、ユーザーIDが見つからない場合、Exceptionの代わりにNoneが返されます。

@login_manager.user_loader 
def load_user(userid): 
    try: 
     #: Flask Peewee used here to return the user object 
     return User.get(User.id==userid) 
    except User.DoesNotExist: 
     return None 
4

あなたは、データベース・アクセスのためのSQLAlchemyのでフラスコ-ログインを組み合わせ、ユーザレコードのバックエンド処理の多くを自動化するFlask-Securityを、使用することをお勧めします。

Quick Startチュートリアルが始まります。 app.config ['SQLALCHEMY_DATABASE_URI']をMySQLデータベース接続文字列に設定します。

関連する問題