колбу-логин: не могу понять, как это работает
Я пытаюсь понять, как 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
работает?
5 ответов:
Flask-login на самом деле не имеет бэкэнда пользователя, он просто обрабатывает механизм сеанса, чтобы помочь вам войти и выйти из системы пользователей. Вы должны сказать ему (с помощью методов украшения), что представляет собой пользователь, и это также до вас, чтобы выяснить, как узнать, является ли пользователь "активным" или нет (так как быть "активным" может означать разные вещи в разных приложениях).
следует читать документация и будьте уверены, что он делает и не. Вот только я здесь собираюсь сосредоточиться на подключении его к бэкэнду db.
для начала определите объект пользователя; который представляет свойства для ваших пользователей. Затем этот объект может запрашивать базы данных, или LDAP, или что-то еще, и это крючок, который соединяет механизм входа в систему с вашей базой данных.
Я буду использовать пример входа скрипт для этой цели.
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()
Flask-login будет пытаться загрузить пользователя перед каждым запросом. Так что да, ваш пример кода будет вызываться перед каждым запросом. Он используется для проверки того, что userid находится в текущем сеансе и будет загружать объект пользователя для этого идентификатора.
@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 () в вашем примере).
кроме того, flask-login предоставляет только механизм для входа/выхода пользователя. Его не волнует, если вы используете базу данных MySQL.
в соответствии с Колбу-Логин's документ объект пользователя должен быть возвращен, и если идентификатор пользователя не найден, он должен вернуть None вместо Exception.
@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
вы можете использовать Фляга-Безопасность, который сочетает в себе Flask-Login с SQLAlchemy для доступа к базе данных и автоматизирует большую часть внутренней обработки записей пользователей.
The Быстрый Старт учебник поможет вам начать. Установите приложение.config ['SQLALCHEMY_DATABASE_URI'] в строку подключения к базе данных MySQL.
вот пример использования колбы login:https://bitbucket.org/leafstorm/flask-login/src/3160dbfc7cfc/example/login-example.py вы должны использовать @login_required для каждого метода, который требует входа в систему. Например,
@app.route('/make-login') @login_required def make_login(): ...