烧瓶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时,我想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 

另外,我又写了两个函数进行身份validation/注册

 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的工作。 此外,我不知道用户是否login。 我怎样才能得到用户名或用户名?

任何人都可以在一些行解释我如何这个Flask-Login工程?

Flask-login实际上并没有用户后端,它只是处理会话机制来帮助你login和注销用户。 你必须告诉它(通过装饰方法),什么代表一个用户,它也取决于你如何知道一个用户是否“活跃”(因为“活跃”可能意味着不同的应用程序在不同的应用程序)。

你应该阅读文档,并确定它做了什么,不做什么 。 在这里,我只关注与db后端的连接。

首先,定义一个用户对象; 它代表您的用户的属性。 然后,这个对象可以查询数据库或LDAP,或者是任何连接login机制和数据库后端的钩子。

我将为此使用login示例脚本。

 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 

一旦你创build了用户对象,你需要编写一个加载用户的方法(基本上,从上面创build一个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方法这样做:

  1. 检查用户名和密码是否匹配(针对你的数据库) – 你需要自己编写这个代码。

  2. 如果validation成功,请获取用户的ID并将其传递给login_user()

Flask-login会在每次请求之前尝试加载用户。 所以是的,下面的示例代码将在每个请求之前调用。 它用于检查当前会话中的用户对象,并将加载该用户对象的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()函数调用你写的callback函数(在你的例子中是load_user())。

此外,flask-login仅提供login/注销用户的机制。 它不关心,如果你正在使用MySQL数据库。

从Flask-Login的文档中,必须返回用户对象,如果找不到用户标识,它应该返回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-Security ,它将Flask-Login和SQLAlchemy结合起来,用于数据库访问,并自动处理用户logging的大部分后端处理。

快速入门教程将帮助您开始。 将app.config ['SQLALCHEMY_DATABASE_URI']设置为您的MySQL数据库连接string。

以下是使用login的Flask示例: https ://bitbucket.org/leafstorm/flask-login/src/3160dbfc7cfc/example/login-example.py您需要为每个需要login的方法使用@login_required。 例如,

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