Flask-Loging 可以方便的管理用戶會話,保護路由只讓認證用戶訪問
http://flask-login.readthedocs.org/en/latest/
一.初始化Flask-Login
from flask.ext.login import loginManager loginManager = LoginManager(app) #如果需要延遲創建app 可使用 # loginManager = LoginManager() # loginManager.init_app(app) loginManager.session_protection = "strong" #可以設置None,'basic','strong' 以提供不同的安全等級,一般設置strong,如果發現異常會登出用戶 loginManager.login_view = "login" #這里填寫你的登陸界面的路由
二.配置及使用Flask-Login
(1)使用flask-login有如下兩種方法
- 在用戶模型中實現 is_authenticated()方法 返回用戶是否登陸
is_active()方法 返回是否允許該用戶登陸,返回false該用戶將不能登陸
is_anonymous()方法 返回是否是匿名用戶, 也就是未登陸的用戶等
get_id() 返回可以唯一標識用戶的Unicode字符串 - 直接讓用戶模型繼承 flask.ext.login.UserMixin類,類中有上面4個方法的默認實現 如:
Flask-Login還提供了 flask.ext.login.AnonymousUserMixin類 繼承至該類的用戶模型 將作為未登陸時的用戶模型,可以保持代碼的一致性from flask.ext.login import UserMixin class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64),unique=True)
(2)Flask-Login要求實現一個回調函數,使用 get_id()方法返回的唯一標識用戶的Unicode字符串 作為參數 返回這個用戶對象.
如果是繼承的UserMixin類, get_id()方法默認返回的用戶的id. 如果用戶不存在,應該返回None.
from . import loginManager @loginManager.user_loader def load_user(user_id): return User.query.get(int(user_id))
(3)如果需要讓頁面只可又認證用戶訪問,可使用login_required裝飾路由函數,未登陸的請求將會跳轉到上面loginManager.login_view設置的登陸頁面路由 如:
from flask.ext.login import login_required @app.route('/index') @login_required def index(): return "只有登陸用戶能看到我"
(4)登陸登出用戶 使用如下代碼:
from flask.ext.login import login_user, logout_user #獲取要登陸的用戶對象 user = User.query.filter_by(username = 'skkg').first() #第一個參數傳入用戶對象,第二個參數 傳入 以后是否自動登陸 login_user(user,True) #登出 logout_user
(5)獲取當前登陸的用戶,
from flask.ext.login import current_user #判斷當前用戶是否是匿名用戶 current_user.is_anonymous()
也可以在模版中使用 {% if current_user.is_authenticated() %} 判斷
(6)在模版中使用,如果用戶已認證就顯示他的名字
{% if current_user.is_authenticated() %}
Hi {{ current_user.name }}!
{% endif %}
