Python?Flask-Login模塊使用案例詳解
先看一下flask-login模塊的整體架構(gòu)
基礎(chǔ)的信息和全局配置這里就不多說,需要用到再斟酌也可以的。
這里也是針對(duì)每個(gè)模塊較為常用的進(jìn)行解釋說明,后期再使用過程中遇到會(huì)進(jìn)行補(bǔ)充。
Login_Manager
LoginManager是一個(gè)類,有多個(gè)方法和屬性;此類初始化的對(duì)象用于保存用于登錄的設(shè)置。實(shí)例:class:LoginManager
* *不綁定到特定應(yīng)用程序,因此可以在代碼的主體中創(chuàng)建一個(gè),然后將其綁定到您的應(yīng)用程序app中 工廠函數(shù)。
初始化一個(gè)LoginManager類對(duì)象
@login_manager.user_loader def load_user(userid): return User.get(userid)
init__app() – 配置該對(duì)象
login_manager.init_app(app)
user_loader() 回調(diào)函數(shù)
自定義回調(diào)函數(shù),user_loader源代碼參考下圖:
源代碼注釋:
這將設(shè)置從會(huì)話重新加載用戶的回調(diào)。 您設(shè)置的函數(shù)應(yīng)該使用用戶ID(“unicode”)并返回用戶對(duì)象,如果用戶不存在則返回“None”。
自定義回調(diào)函數(shù)
@login_manager.user_loader def load_user(userid): return User.get(userid)
在執(zhí)行該段代碼之后,注冊(cè)了load_user()這個(gè)自定義的callback。
reload_user()
1、首先獲取user id,如果獲取不到有效的id,就將user設(shè)為anonymous user
2、獲取到id后,再通過@login_manager.user_loader裝飾的函數(shù)獲取到user對(duì)象,如果沒有獲取到有效的user對(duì)象,就認(rèn)為是anonymous user
3、最后將user保存于request context中(無論是正常的用戶還是anonymous用戶)
源代碼注釋
這將ctx.user設(shè)置為由您的自定義user_loader回調(diào)函數(shù)加載的用戶對(duì)象,該函數(shù)應(yīng)使用從session獲取的user_id檢索用戶對(duì)象。
語法示例:
來自于flask_login導(dǎo)入LoginManager
@ login_manager.user_loader
def any_valid_func_name(user_id):
#使用給定的user_id獲取用戶對(duì)象,
#如果您使用SQLAlchemy,例如:
user_obj = User.query.get(int(user_id))
return user_obj
讓你定義這個(gè)self.user_callback的原因:
因?yàn)槲覀儾恢滥銓⑷绾?在哪里加載用戶對(duì)象。
(實(shí)例屬性的配置) login-view :驗(yàn)證失敗跳轉(zhuǎn)的界面
login_manager.login_view = "/"
跳轉(zhuǎn)到/首頁目錄
login-message:用戶重定向到登錄頁面時(shí)閃出的消息
login_manager.login_message ='Please login first!'
refresh-view:用戶需要重新進(jìn)行身份驗(yàn)證時(shí)要重定向到的視圖的名稱。
login_manager.refresh_view = "/"
needs-refresh-message:用戶重定向到“需要刷新”頁面時(shí)閃出的消息。
login_manager.needs_refresh_message = 'Refresh for login!'
session-protection:使用會(huì)話保護(hù)的模式。這可以是'basic'
(默認(rèn))或'strong'
,或None
禁用
login_manager.session_protection = ‘strong’
utils
Login_required
current_user.is_authenticated,判斷當(dāng)前用戶是否認(rèn)證,如果沒有認(rèn)證的話就執(zhí)行unauthorized(),
unauthorized()會(huì)重定向到login_view參數(shù)設(shè)置的路由函數(shù)中去,所以在實(shí)例化LoginManager后要設(shè)置login_view屬性,
當(dāng)用戶沒有登陸時(shí),會(huì)自動(dòng)重定向到登陸界面,沒有設(shè)置會(huì)返回401錯(cuò)誤, 用戶登陸后,這個(gè)裝飾器就直接返回func(*args, **kwargs),相當(dāng)于沒有包裝一樣,裝飾器起到包裝接口的作用。
源碼解釋:
1、如果使用此裝飾視圖,它將確保在調(diào)用實(shí)際視圖之前登錄并驗(yàn)證當(dāng)前用戶。如果驗(yàn)證不通過,那么則會(huì)調(diào)用LoginManager.unauthorized()
2、#如果request method為例外method,即在EXEMPT_METHODS中的method,可以不必鑒權(quán)
3、如果_login_disabled為True則不必鑒權(quán)
Login_user
用戶登錄操作,用戶在通過自定義的login視圖函數(shù),通過驗(yàn)證并登錄成功后,需要
# Flask-Login中的login_user可以記錄/保存當(dāng)前成功登陸的用戶 login_user(user)
logout_user
登出功能類似,除了基本的操作外,還需要把flask-login中的登出進(jìn)行操作
@app.route('/logout') @login_required def logout(): logout_user() return 'Logged out successfully!'
UserMixin
is_authenticated
當(dāng)用戶通過驗(yàn)證時(shí),也即提供有效證明時(shí)返回 True 。(只有通過驗(yàn)證的用戶會(huì)滿足 login_required 的條件。)
is_active
如果這是一個(gè)活動(dòng)用戶且通過驗(yàn)證,賬戶也已激活,未被停用,也不符合任何你 的應(yīng)用拒絕一個(gè)賬號(hào)的條件,返回 True 。不活動(dòng)的賬號(hào)可能不會(huì)登入(當(dāng)然, 是在沒被強(qiáng)制的情況下)。
is_anonymous
如果是一個(gè)匿名用戶,返回 True 。(真實(shí)用戶應(yīng)返回 False 。)
get_id()
返回一個(gè)能唯一識(shí)別用戶的,并能用于從 user_loader 回調(diào)中加載用戶的 unicode 。注意著 必須 是一個(gè) unicode —— 如果 ID 原本是 一個(gè) int 或其它類型,你需要把它轉(zhuǎn)換為 unicode 。
要簡(jiǎn)便地實(shí)現(xiàn)用戶類,你可以從 UserMixin 繼承,它提供了對(duì)所有這些方法的默認(rèn) 實(shí)現(xiàn)。(雖然這不是必須的。)
Flask-Login 一般使用基礎(chǔ)流程
Flask-Login 通過 user session,提供登錄的常見任務(wù),比如登入 (logging in)、登出 (logging out) 和當(dāng)前用戶 (current user)
login_user()
:實(shí)現(xiàn)用戶的登入,一般在登入的視圖函數(shù)中調(diào)用
logout_user()
:實(shí)現(xiàn)登出功能
current_user 屬性
:獲取當(dāng)前用戶
如果需要頁面是授權(quán)用戶才可見,在相應(yīng)視圖函數(shù)前加上 @login_required
裝飾器進(jìn)行聲明即可,@login_required 裝飾器對(duì)于未登錄用戶訪問,默認(rèn)處理是重定向到 LoginManager.login_view
所指定的視圖
1.定義 User
登錄基于用戶,需要定義 User 類,F(xiàn)lask-Login 規(guī)定 User 類必須實(shí)現(xiàn)三個(gè)屬性和一個(gè)方法:
is_authenticated 屬性
is_active 屬性
is_anonymous 屬性
get_id() 方法
最簡(jiǎn)單的方法是從 UserMixin 類繼承,該類提供了默認(rèn)的實(shí)現(xiàn)。
from flask_login import UserMixin class User(UserMixin,db.Model): pass
2.應(yīng)用程序的配置
創(chuàng)建 LoginManager 實(shí)例,然后與 app 綁定。、
from flask_login import LoginManager login_manager = LoginManager() login_manager.login_view = 'login' login_manager.login_message_category = 'info' login_manager.login_message = 'Access denied.' login_manager.init_app(app)
3.user_loader 回調(diào)函數(shù)
user session 記錄的是用戶 ID (user_id),回調(diào)函數(shù)的作用就是通過 user_id 返回對(duì)應(yīng)的 User 對(duì)象。user_loader 回調(diào)函數(shù)在 user_id 非法的時(shí)候不應(yīng)該拋出異常,而要返回 None。沒有這個(gè)回調(diào)函數(shù)的話,F(xiàn)lask-Login 將無法工作
@login_manager.user_loader def load_user(user_id): if query_user(user_id) is not None: curr_user = User() curr_user.id = user_id return curr_user
4.登入功能實(shí)現(xiàn)
@app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': user_id = request.form.get('userid') user = query_user(user_id) if user is not None and request.form['password'] == user['password']: curr_user = User() curr_user.id = user_id # 通過Flask-Login的login_user方法登錄用戶 login_user(curr_user) return redirect(url_for('index')) flash('Wrong username or password!') # GET 請(qǐng)求 return render_template('login.html')
關(guān)鍵就是 login_user(curr_user) 這句代碼,之前要構(gòu)建 User 對(duì)象,并指定 id。
5.登出功能實(shí)現(xiàn)
@app.route('/logout') @login_required def logout(): logout_user() return 'Logged out successfully!'
到此這篇關(guān)于Python Flask-Login模塊使用案例詳解的文章就介紹到這了,更多相關(guān)flask-login使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Numpy中np.dot與np.matmul的區(qū)別詳解
本文主要介紹了Numpy中np.dot與np.matmul的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Python腳本實(shí)現(xiàn)集群檢測(cè)和管理功能
這篇文章主要介紹了Python腳本實(shí)現(xiàn)集群檢測(cè)和管理功能,本文講解了實(shí)現(xiàn)想法、開發(fā)工具選擇、經(jīng)驗(yàn)分享、代碼示例等內(nèi)容,需要的朋友可以參考下2015-03-03Python使用異步線程池如何實(shí)現(xiàn)異步TCP服務(wù)器交互
這篇文章主要介紹了Python使用異步線程池如何實(shí)現(xiàn)異步TCP服務(wù)器交互問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Python將數(shù)據(jù)生成二維碼的四種方法實(shí)例代碼
二維碼在日常生活中非常常見,廣泛應(yīng)用于支付、登錄驗(yàn)證、信息分享等場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于Python將數(shù)據(jù)生成二維碼的四種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09Python實(shí)現(xiàn)繪制自定義形狀的詞云示例
這篇文章主要介紹了Python實(shí)現(xiàn)繪制自定義形狀的詞云示例,通過將一段文本中出現(xiàn)頻率高的單詞按其出現(xiàn)頻率大小以及顏色深淺排列成一個(gè)詞云圖形,從而更好地展示文本中的信息,需要的朋友可以參考下2022-10-10python實(shí)現(xiàn)拉普拉斯特征圖降維示例
今天小編就為大家分享一篇python實(shí)現(xiàn)拉普拉斯特征圖降維示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11Python基本數(shù)據(jù)類型及內(nèi)置方法
這篇文章主要介紹了Python基本數(shù)據(jù)類型及內(nèi)置方法,??數(shù)據(jù)類型是用來記錄事物狀態(tài)的,而事物的狀態(tài)是不斷變化的,下文圍繞主題展開相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-04-04Python通過psd-tools解析PSD文件的實(shí)現(xiàn)
本文主要介紹了Python通過psd-tools解析PSD文件的實(shí)現(xiàn),主要包括如何獲取PSD文件的基本信息、遍歷圖層、提取圖層詳細(xì)信息、保存和創(chuàng)建PSD文件,感興趣的可以了解一下2023-12-12