web-dev-qa-db-ja.com

flask-login:仕組みがわからない

私は 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')

/ make-loginにアクセスすると、ログインしたいです。

私のユーザークラス:

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 動作しますか?

64
Sorin Vladu

Flask-loginには実際にユーザーバックエンドはありません。ユーザーのログインとログアウトを支援するセッションメカニズムを処理するだけです。 (メソッドを装飾することで)ユーザーを表すものを伝える必要があり、ユーザーが「アクティブ」かどうかを知る方法を理解する必要があります(「アクティブ」は異なるアプリケーションで異なることを意味することがあるため) )。

ドキュメント を読んで、それが何をするかとしないことを確認してください。ここでは、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()に渡します

67
Burhan Khalid

Flask-loginは、すべてのリクエストの前にユーザーをロードしようとします。そのため、次のサンプルコードはすべてのリクエストの前に呼び出されます。現在のセッションのユーザーIDを確認するために使用され、そのIDのユーザーオブジェクトを読み込みます。

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

GithubのFlask-loginソースコードを見ると、関数init_appの下に次の行があります。

app.before_request(self._load_user)

したがって、すべての要求の前に、_load_user関数が呼び出されます。 _load_user関数は、実際には条件に基づいて別の関数「reload_user()」を呼び出します。最後に、reload_user()関数は、作成したコールバック関数を呼び出します(例ではload_user())。

また、flask-loginはユーザーをログイン/ログアウトするメカニズムのみを提供します。 mysqlデータベースを使用しているかどうかは関係ありません。

14
codegeek

Flask-Login のドキュメントによると、ユーザーオブジェクトを返す必要があり、ユーザーIDが見つからない場合は、例外ではなく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
5
beebek

Flask-Security を使用すると、データベースアクセスのためにFlask-LoginとSQLAlchemyを組み合わせて、ユーザーレコードのバックエンド処理の多くを自動化できます。

クイックスタート チュートリアルで開始できます。 app.config ['SQLALCHEMY_DATABASE_URI']をMySQLデータベース接続文字列に設定します。

5
Steve Saporta

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
DrSkippy