那些年我們學Flask-login,踩過史上最大的坑
Flask-Loging 可以方便的管理用戶會話,保護路由只讓認證用戶訪問
http://flask-login.readthedocs.org/en/latest/
注意:我這裏使用的是models使用的是sqlachemy,和flask-sqlachemy的查詢語法還有稍微有些區別
一.初始化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字符串注意:這個是在UserMinx裏面
直接讓用戶模型繼承 flask.ext.login.UserMixin類,類中有上面4個方法的默認實現 如:
flask-sqlachemy和sqlchemy這裏都一樣:
from flask.ext.login import UserMixinclass User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64),unique=True)
Flask-Login還提供了 flask.ext.login.AnonymousUserMixin類 繼承至該類的用戶模型 將作爲未登陸時的用戶模型,可以保持代碼的一致性
(2)Flask-Login要求實現一個回調函數,使用 get_id()方法返回的唯一標識用戶的Unicode字符串 作爲參數 返回這個用戶對象.
如果是繼承的UserMixin類, get_id()方法默認返回的用戶的id. 如果用戶不存在,應該返回None.
此外如果需要定製數據庫的nid時,可在上方添加:
def get_id(self): return self.nid
默認情況下是查看id的:如果數據庫的user表的主鍵爲id,則可不定製get_id()
flask-sqlachemy的語法如下:
from . import loginManager @loginManager.user_loaderdef load_user(user_id): return User.query.get(int(user_id))
sqlachemy語法如下:
from . import loginManager #conn爲連接數據庫返回的session() @loginManager.user_loaderdef load_user(user_id): return conn.query(Users).filter_by(id = id).first()
(3)如果需要讓頁面只可又認證用戶訪問,可使用login_required裝飾路由函數,未登陸的請求將會跳轉到上面loginManager.login_view設置的登陸頁面路由 如:
from flask.ext.login import login_required @app.route('/index') @login_requireddef index(): return "只有登陸用戶能看到我"
(4)登陸登出用戶 使用如下代碼:
from flask.ext.login import login_user, logout_user #獲取要登陸的用戶對象 user = User.query.filter_by(user_name=username).first() #sqlachemy的查詢語法 #user = conn.query(Users).filter_by(user_name=username,password=password).first() #第一個參數傳入用戶對象,第二個參數 傳入 以後是否自動登陸 login_user(user,True) #登出logout_user()
注意:如上查詢的是flask-sqlachemy的語法,與sqlachemy查詢語句略微不同
(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 %}
這裏注意:is_authenticated()加上()會報錯,current_user.name的name是users表的nam
e