Flask-Login是一個(gè)用于處理用戶認(rèn)證和會(huì)話管理的Flask插件。它簡化了在Flask應(yīng)用程序中實(shí)現(xiàn)用戶登錄、登出以及保護(hù)視圖等功能的過程。
一、安裝及初始化
flask-login官方文檔
pip install flask-login
在flask中進(jìn)行配置:
from flask import Flask
from flask_login import LoginManager
app = Flask(__name__)
login_manager = LoginManager()
# 初始化LoginManager對象
login_manager.init_app(app)
完成初始化之后,就可以在應(yīng)用中使用login_manager對象來處理用戶認(rèn)證和會(huì)話管理等功能。例如設(shè)置用戶加載回調(diào)函數(shù)
保護(hù)視圖函數(shù)等。
二、設(shè)置用戶加載回調(diào)函數(shù)
此回調(diào)用于從會(huì)話中存儲(chǔ)的用戶ID重新加載用戶對象。它應(yīng)該獲取用戶的ID,并返回相應(yīng)的用戶對象。例如:
@login_manager.user_loader
def load_user(user_id):
# 根據(jù)用戶 ID 查詢用戶對象
user = User.query.get(int(user_id))
return user
三、定義User類
定義 User 類:創(chuàng)建一個(gè) User 類,表示應(yīng)用程序中的用戶,該類需要實(shí)現(xiàn)以下幾個(gè)方法:
- is_authenticated():返回 True 如果用戶已經(jīng)通過認(rèn)證,否則返回 False。
- is_active():返回 True 如果用戶是活躍的,否則返回 False。如果用戶被禁用,可以返回 False。
- is_anonymous():返回 True 如果當(dāng)前用戶是匿名用戶,否則返回 False。
- get_id():返回一個(gè)唯一標(biāo)識(shí)符的字符串,用于標(biāo)識(shí)用戶。
class User:
def __init__(self, user_id, username, password):
self.id = user_id
self.username = username
self.password = password
def is_authenticated(self):
# 根據(jù)你的認(rèn)證邏輯判斷用戶是否已經(jīng)通過認(rèn)證
return True # 假設(shè)用戶都已經(jīng)通過認(rèn)證
def is_active(self):
# 根據(jù)你的邏輯判斷用戶是否是活躍的
return True # 假設(shè)所有用戶都是活躍的
def is_anonymous(self):
# 根據(jù)你的邏輯判斷當(dāng)前用戶是否是匿名用戶
return False # 假設(shè)所有用戶都不是匿名的
def get_id(self):
# 返回一個(gè)唯一標(biāo)識(shí)符的字符串,用于標(biāo)識(shí)用戶
return str(self.id)
@staticmethod
def get(user_id):
# 從數(shù)據(jù)庫或其他數(shù)據(jù)源中獲取用戶對象
# 根據(jù)用戶 ID 查詢用戶,并返回 User 對象
# 如果找不到用戶,可以返回 None
return User(user_id, 'username', 'password')
四、實(shí)現(xiàn)登陸操作
login_user(user)會(huì)自動(dòng)調(diào)用 User 對象中的 is_authenticated()、is_active() 和 get_id() 方法來判斷用戶是否通過認(rèn)證、是否活躍以及獲取用戶的唯一標(biāo)識(shí)符。
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
# 驗(yàn)證表單
if form.validate_on_submit():
login_user(user)
flask.flash('Logged in successfully.')
# 獲取名為"next"的查詢參數(shù)的值
next = flask.request.args.get('next')
# 檢查驗(yàn)證給定的URL是否與當(dāng)前請求的主機(jī)和協(xié)議匹配,防止跳轉(zhuǎn)到不受信任的主機(jī)或使用不安全的協(xié)議。
if not url_has_allowed_host_and_scheme(next, request.host):
return flask.abort(400)
return flask.redirect(next or flask.url_for('index'))
return flask.render_template('login.html', form=form)
登陸成功后就可以在模板中使用current_user來獲取當(dāng)前登陸用戶了。
{% if current_user.is_authenticated %}
Hi {{ current_user.name }}!
{% endif %}
需要進(jìn)行登陸驗(yàn)證的視圖函數(shù)可以使用@login_required修飾器來進(jìn)行裝飾。
也可以使用logout_user()方法來退出登陸。
@app.route("/settings")
@login_required
def settings():
pass
@app.route("/logout")
@login_required
def logout():
logout_user()
return redirect(somewhere)
五、自定義登陸過程
默認(rèn)情況下,當(dāng)用戶試圖在未登錄的情況下訪問login_required視圖時(shí),F(xiàn)lask login會(huì)閃爍一條消息,并將其重定向到登錄視圖。(如果未設(shè)置登錄視圖,它將中止,并顯示401錯(cuò)誤。)
所以我們需要設(shè)置登錄頁面的視圖函數(shù),并指定登錄頁面的 URL。
# 自定義未登錄消息視圖
login_manager.login_view = 'login'
# 自定義未登錄消息內(nèi)容
login_manager.login_message = u"Bonvolu ensaluti por uzi tiun pa?on."
# 自定義未登錄消息類別
login_manager.login_message_category = "info"
@login_manager.unauthorized_handler 是 Flask-Login 提供的裝飾器,用于定義未經(jīng)授權(quán)用戶訪問受保護(hù)頁面時(shí)的處理方式。
通過此修飾器能夠幫助定制未經(jīng)授權(quán)訪問的處理方式,以便提供更好的用戶體驗(yàn)和安全性。
@login_manager.unauthorized_handler
def unauthorized_callback():
return redirect('/login')
六、使用請求加載器自定義登錄
使用請求加載器自定義登錄過程。請求加載器允許你根據(jù)請求中的信息動(dòng)態(tài)加載用戶對象,以滿足特定的登錄需求。例如獲取請求頭中的認(rèn)證信息、查詢參數(shù)等。
@login_manager.request_loader
def load_user_from_request(request):
# 從請求中獲取用戶標(biāo)識(shí),例如獲取請求頭中的認(rèn)證信息、查詢參數(shù)等
user_id = request.headers.get('Authorization')
# 根據(jù)用戶標(biāo)識(shí)加載用戶對象
user = User.query.get(user_id)
return user
七、匿名用戶功能
Flask-Login 提供了匿名用戶功能,允許你在未登錄的情況下訪問受保護(hù)的頁面。匿名用戶對象是一個(gè)特殊的 UserMixin 對象,它提供了一些默認(rèn)的屬性和方法,可以模擬已登錄用戶的行為。
- 設(shè)置login_manager.anonymous_user屬性
login_manager.anonymous_user = Anonymous
- 定義匿名對象Anonymous
# 定義匿名用戶對象
class Anonymous(AnonymousUserMixin):
@property
def is_authenticated(self):
return False
八、記住我功能
"記住我"功能是一種常見的身份驗(yàn)證功能,它允許用戶在關(guān)閉瀏覽器后仍然保持登錄狀態(tài)。當(dāng)用戶勾選 “記住我” 選項(xiàng)時(shí),系統(tǒng)會(huì)生成一個(gè)長期有效的憑證(通常是一個(gè)加密的令牌),并在用戶下次訪問時(shí)使用該憑證自動(dòng)登錄用戶。
要實(shí)現(xiàn) “記住我” 功能,你可以借助 Flask-Login 提供的 remember_me 參數(shù)和相關(guān)方法。文章來源:http://www.zghlxwxcb.cn/news/detail-817910.html
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
# 驗(yàn)證用戶名和密碼,并獲取用戶 ID
username = request.form['username']
password = request.form['password']
user_id = authenticate(username, password) # 自定義的驗(yàn)證函數(shù)
if user_id:
# remember 值為 True/False
remember_me = request.form.get('remember_me')
user = get_user(user_id)
login_user(user, remember=remember_me)
return '登錄成功'
else:
return '用戶名或密碼錯(cuò)誤'
return render_template('login.html')
當(dāng)用戶勾選了 “記住我” 選項(xiàng)后,系統(tǒng)會(huì)生成一個(gè)長期有效的憑證(通常是一個(gè)加密的令牌),并在用戶下次訪問時(shí)使用該憑證自動(dòng)登錄用戶,無需再次進(jìn)行登錄操作。文章來源地址http://www.zghlxwxcb.cn/news/detail-817910.html
到了這里,關(guān)于flask web 學(xué)習(xí)之用戶認(rèn)證與會(huì)話管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!