Sor*_*adu 66 python mysql flask-login
我试图了解它是如何Flask-Login工作的.
我在他们的文档中看到他们使用预先填充的用户列表.我想玩数据库存储用户列表.
但是,我不明白这个Flask-Login模块中的一些内容.
@login_manager.user_loader
def load_user(userid):
#print 'this is executed',userid
return user(userid, 'asdf')
Run Code Online (Sandbox Code Playgroud)
每次请求都会调用此代码?这用于加载我的用户对象的所有细节?
现在,我有这个代码:
@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')
Run Code Online (Sandbox Code Playgroud)
当我访问/登录时,我想登录.
我的用户类:
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
Run Code Online (Sandbox Code Playgroud)
另外,我为验证/注册写了另外两个函数
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
Run Code Online (Sandbox Code Playgroud)
我不知道如何Flask-Login使用MySQL.此外,我不知道用户是否已登录.如何获取用户ID或用户名?
任何人都可以在某些行中解释我这Flask-Login是如何工作的?
Bur*_*lid 68
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
Run Code Online (Sandbox Code Playgroud)
一旦创建了用户对象,就需要编写一个加载用户的方法(基本上,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)
Run Code Online (Sandbox Code Playgroud)
完成这些步骤后,您的登录方法会执行以下操作:
检查用户名和密码是否匹配(针对您的数据库) - 您需要自己编写此代码.
如果身份验证成功,请获取用户的ID并将其传递给 login_user()
cod*_*eek 14
Flask-login将尝试在每次请求之前加载用户.所以,是的,下面的示例代码将在每个请求之前调用.它用于检查当前会话中的用户标识,并将加载该标识的用户对象.
@login_manager.user_loader
def load_user(userid):
#print 'this is executed',userid
return user(userid, 'asdf')
Run Code Online (Sandbox Code Playgroud)
如果你看看github上的Flask-login源代码,init_app函数下面有一行代码:
app.before_request(self._load_user)
Run Code Online (Sandbox Code Playgroud)
因此,在每个请求之前,都会调用_load_user函数._load_user函数实际上根据条件调用另一个函数"reload_user()".最后,reload_user()函数调用您编写的回调函数(在您的示例中为load_user()).
另外,flask-login仅提供登录/注销用户的机制.它不关心你是否使用mysql数据库.
根据Flask-Login的文档,必须返回一个用户对象,如果找不到用户id,则应该返回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
Run Code Online (Sandbox Code Playgroud)
您可能希望使用Flask-Security,它将Flask-Login与SQLAlchemy结合使用以进行数据库访问,并自动执行大部分用户记录的后端处理.
该快速入门教程将让你开始.将app.config ['SQLALCHEMY_DATABASE_URI']设置为MySQL数据库连接字符串.
| 归档时间: |
|
| 查看次数: |
46582 次 |
| 最近记录: |