那些年我們學Flask-login,踩過史上最大的坑

那些年我們學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有如下兩種方法

  1. 在用戶模型中實現 is_authenticated()方法 返回用戶是否登陸
    is_active()方法  返回是否允許該用戶登陸,返回false該用戶將不能登陸
    is_anonymous()方法 返回是否是匿名用戶, 也就是未登陸的用戶等
    get_id() 返回可以唯一標識用戶的Unicode字符串


    注意:這個是在UserMinx裏面



  2. 直接讓用戶模型繼承 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)


  1. 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章