回顾
在前面的系列章节中,我们创建了一个数据库并且学着用用户和邮件来填充,但是到现在我们还没能够植入到我们的程序中。 两章之前,我们已经看到怎么去创建网络表单并且留下了一个实现完全的登陆表单。
在这篇文章中,我们将基于我门所学的网络表单和数据库来构建并实现我们自己的用户登录系统。教程的最后我们小程序会实现新用户注册,登陆和退出的功能。
为了能跟上这章节,你需要前一章节最后部分,我们留下的微博程序。请确保你的程序已经正确安装和运行。
在前面的章节,我们开始配置我们将要用到的Flask扩展。为了登录系统,我们将使用两个扩展,Flask-Login 和 Flask-OpenID. 配置如下所示 (fileapp/__init__.py):
import osfrom flaskext.login import LoginManagerfrom flaskext.openid import OpenIDfrom config import basedir lm = LoginManager()lm.setup_app(app)oid = OpenID(app, os.path.join(basedir, 'tmp'))
Flask-OpenID 扩展为了可以存储临时文件,需要一个临时文件夹路径。为此,我们提供了它的位置。
重访我们的用户模型
Flask-Login扩展需要在我们的User类里实现一些方法。除了这些方法以外,类没有被要求实现其它方法。
下面是我们的User类 (fileapp/models.py):
class User(db.Model): id = db.Column(db.Integer, primary_key = True) nickname = db.Column(db.String(64), unique = True) email = db.Column(db.String(120), unique = True) role = db.Column(db.SmallInteger, default = ROLE_USER) posts = db.relationship('Post', backref = 'author', lazy = 'dynamic') def is_authenticated(self): return True def is_active(self): return True def is_anonymous(self): return False def get_id(self): return unicode(self.id) def __repr__(self): return '<User %r>' % (self.name)
is_authenticated方法是一个误导性的名字的方法,通常这个方法应该返回True,除非对象代表一个由于某种原因没有被认证的用户。
is_active方法应该为用户返回True除非用户不是激活的,例如,他们已经被禁了。
is_anonymous方法应该为那些不被获准登录的用户返回True。
最后,get_id方法为用户返回唯一的unicode标识符。我们用数据库层生成唯一的id。
用户加载回调
现在我们通过使用Flask-Login和Flask-OpenID扩展来实现登录系统
首先,我们需要写一个方法从数据库加载到一个用户。这个方法会被Flask-Login使用(fileapp/views.py):
@lm.user_loaderdef load_user(id): return User.query.get(int(id))
记住Flask-Login里的user id一直是unicode类型的,所以在我们把id传递给Flask-SQLAlchemy时,有必要把它转化成integer类型。
新闻热点
疑难解答