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