Подтвердить что ты не робот

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

Кроме того, я написал еще две функции для аутентификации/регистрации

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. Кроме того, я не знаю, вошел ли пользователь в систему. Как я могу получить идентификатор пользователя или имя пользователя?

Кто-нибудь может объяснить мне в некоторых строках, как работает Flask-Login?

4b9b3361

Ответ 1

Фланец-логин фактически не имеет пользовательского бэкэнд, он просто обрабатывает сеансовое оборудование, чтобы помочь вам войти в систему и выйти из системы. Вы должны сказать это (посредством методов украшения), что представляет пользователя, и вам также нужно выяснить, как узнать, активен ли пользователь или нет (поскольку "активный" может означать разные вещи в разных приложениях).

Вы должны прочитать документацию и быть уверенным, что она делает и не делает. Здесь я собираюсь сосредоточиться только на том, чтобы подключить его к бэкэнду db.

Чтобы начать с, определите пользовательский объект; который представляет свойства для ваших пользователей. Этот объект может затем запрашивать базы данных или LDAP или что-то еще, и это крюк, который соединяет механизм входа с вашим бэкэндом базы данных.

Я буду использовать пример входа в систему script для этой цели.

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 сверху). Этот метод вызывается с идентификатором пользователя.

@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)

Как только вы выполните эти шаги, ваш метод входа в систему делает следующее:

  • Проверяет, не совпадают ли имя пользователя и пароль (против вашей базы данных) - вам нужно написать этот код самостоятельно.

  • Если аутентификация прошла успешно, введите идентификатор пользователя и передайте его login_user()

Ответ 2

Flask-login попытается загрузить пользователя перед каждым запросом. Так что да, ваш примерный код ниже будет вызываться перед каждым запросом. Он используется для проверки того, какой идентификатор пользователя находится в текущем сеансе, и загрузит пользовательский объект для этого идентификатора.

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

Если вы посмотрите на исходный код Flask-login на github, есть строка под функцией init_app, которая идет:

app.before_request(self._load_user)

Поэтому перед каждым запросом вызывается функция _load_user. Функции _load_user фактически вызывают другую функцию "reload_user()" на основе условий. И, наконец, функция reload_user() вызывает вашу функцию обратного вызова, которую вы написали (load_user() в вашем примере).

Кроме того, флажок-логин предоставляет механизм входа/выхода из системы пользователя. Не важно, используете ли вы базу данных mysql.

Ответ 3

Возможно, вы захотите использовать Flask-Security, который сочетает Flask-Login с SQLAlchemy для доступа к базе данных и автоматизирует большую часть внутренней обработки записей пользователя.

Учебник Quick Start поможет вам начать работу. Установите app.config ['SQLALCHEMY_DATABASE_URI'] в строку подключения к базе данных MySQL.

Ответ 4

В соответствии с документом Flask-Login должен быть возвращен объект пользователя, и если идентификатор пользователя не найден, он должен вернуть 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

Вот пример использования флажка с использованием логина: https://bitbucket.org/leafstorm/flask-login/src/3160dbfc7cfc/example/login-example.py Вам нужно использовать @login_required для каждого метода, требующего входа в систему. Например,

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