回顧
在前面的系列章節(jié)中,我們創(chuàng)建了一個(gè)數(shù)據(jù)庫并且學(xué)著用用戶和郵件來填充,但是到現(xiàn)在我們還沒能夠植入到我們的程序中。 兩章之前,我們已經(jīng)看到怎么去創(chuàng)建網(wǎng)絡(luò)表單并且留下了一個(gè)實(shí)現(xiàn)完全的登陸表單。
在這篇文章中,我們將基于我門所學(xué)的網(wǎng)絡(luò)表單和數(shù)據(jù)庫來構(gòu)建并實(shí)現(xiàn)我們自己的用戶登錄系統(tǒng)。教程的最后我們小程序會(huì)實(shí)現(xiàn)新用戶注冊(cè),登陸和退出的功能。
為了能跟上這章節(jié),你需要前一章節(jié)最后部分,我們留下的微博程序。請(qǐng)確保你的程序已經(jīng)正確安裝和運(yùn)行。
在前面的章節(jié),我們開始配置我們將要用到的Flask擴(kuò)展。為了登錄系統(tǒng),我們將使用兩個(gè)擴(kuò)展,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 擴(kuò)展為了可以存儲(chǔ)臨時(shí)文件,需要一個(gè)臨時(shí)文件夾路徑。為此,我們提供了它的位置。
重訪我們的用戶模型
Flask-Login擴(kuò)展需要在我們的User類里實(shí)現(xiàn)一些方法。除了這些方法以外,類沒有被要求實(shí)現(xiàn)其它方法。
下面是我們的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方法是一個(gè)誤導(dǎo)性的名字的方法,通常這個(gè)方法應(yīng)該返回True,除非對(duì)象代表一個(gè)由于某種原因沒有被認(rèn)證的用戶。
is_active方法應(yīng)該為用戶返回True除非用戶不是激活的,例如,他們已經(jīng)被禁了。
is_anonymous方法應(yīng)該為那些不被獲準(zhǔn)登錄的用戶返回True。
最后,get_id方法為用戶返回唯一的unicode標(biāo)識(shí)符。我們用數(shù)據(jù)庫層生成唯一的id。
用戶加載回調(diào)
現(xiàn)在我們通過使用Flask-Login和Flask-OpenID擴(kuò)展來實(shí)現(xiàn)登錄系統(tǒng)
首先,我們需要寫一個(gè)方法從數(shù)據(jù)庫加載到一個(gè)用戶。這個(gè)方法會(huì)被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時(shí),有必要把它轉(zhuǎn)化成integer類型。
新聞熱點(diǎn)
疑難解答
圖片精選