欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python?flask?框架使用flask-login?模塊的詳細(xì)過(guò)程

 更新時(shí)間:2023年01月29日 10:51:15   作者:夢(mèng)想橡皮擦  
Flask-Login?是一個(gè)?Flask?模塊,可以為?Flask?應(yīng)用程序提供用戶登錄功能,這篇文章主要介紹了Python?flask?框架使用?flask-login?模塊,需要的朋友可以參考下

flask-login 模塊簡(jiǎn)介

Flask-Login 是一個(gè) Flask 模塊,可以為 Flask 應(yīng)用程序提供用戶登錄功能。要在 Flask 應(yīng)用程序中使用 Flask-Login,需要先安裝它:

pip install flask-login

這了有個(gè)小細(xì)節(jié)需要注意,模塊安裝都使用中劃線(-),模塊使用時(shí)用下劃線 _

在應(yīng)用程序中導(dǎo)入并初始化 Flask-Login

from flask import Flask
from flask_login import LoginManager
app = Flask(__name__)
login_manager = LoginManager(app)

上述代碼中提及了 LoginManager 類,該類是 Flask-Login 提供的主要入口點(diǎn),用于管理用戶登錄狀態(tài)。在你的 Flask 應(yīng)用程序中初始化它。

然后我們可以使用 init_app() 函數(shù)來(lái)初始化 LoginManager 實(shí)例并綁定到指定的 Flask 應(yīng)用上。這樣就可以在應(yīng)用程序中使用該實(shí)例來(lái)管理用戶登錄狀態(tài)。

一些常用的配置項(xiàng):

  • login_view: 登錄頁(yè)面的名稱或路由,默認(rèn)為 'login';
  • session_protection : 一個(gè)字符串,定義 session 保護(hù)級(jí)別,可用的值為 'basic' , 'strong' , 'None';
  • user_callback: 當(dāng)未登錄時(shí)被調(diào)用的回調(diào)函數(shù);
  • unauthorized_callback: 當(dāng)未登錄且 session_protection != None 時(shí)被調(diào)用的回調(diào)函數(shù);
  • login_message:用戶未登錄時(shí)顯示的消息;
  • login_message_category:消息類別,默認(rèn)是 ‘message’;

在上面的示例中,我們沒(méi)有指定登錄頁(yè)面,系統(tǒng)會(huì)默認(rèn)使用 “login” 作為登錄頁(yè)面,如果需要指定其他頁(yè)面,可以在初始化后設(shè)置 login_view 屬性。

login_manager.login_view = 'your_login_route'

展示一下完整示例代碼。

from flask import Flask, render_template, redirect, url_for, request
from flask_login import LoginManager, login_user, logout_user, login_required

app = Flask(__name__)
login_manager = LoginManager(app)
@login_manager.user_loader
def load_user(user_id):
    # 加載用戶
    user = list()
    return user
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        # 登錄校驗(yàn)代碼
        username = request.form['username']
        password = request.form['password']
        user = load_user(username)
        # 注意 user.verify_password 是自定義函數(shù),用來(lái)校驗(yàn)密碼是否正確
        if user and user.verify_password(password):
            login_user(user)
            return redirect(url_for('home'))
    return render_template('login.html')
@app.route('/logout')
@login_required
def logout():
    logout_user()
    return redirect(url_for('home'))

Flask-Login 模塊的上手細(xì)節(jié)

user_loader 函數(shù)

user_loader() 函數(shù)是 Flask-Login 提供的一個(gè)裝飾器,用來(lái)設(shè)置一個(gè)回調(diào)函數(shù),用來(lái)加載用戶。這個(gè)函數(shù)需要接收一個(gè)用戶 ID 作為參數(shù),并返回一個(gè)用戶對(duì)象。

@login_manager.user_loader
def load_user(user_id):
    # 從數(shù)據(jù)庫(kù)或者其他存儲(chǔ)位置 讀取用戶信息
    user = list()
    return user

使用了該裝飾器之后,每當(dāng) Flask-Login 需要加載用戶時(shí),都會(huì)調(diào)用這個(gè)回調(diào)函數(shù),并傳入用戶 ID 作為參數(shù)。該函數(shù)應(yīng)該根據(jù)用戶 ID 從數(shù)據(jù)庫(kù)或其他存儲(chǔ)中加載用戶,并返回用戶對(duì)象。如果沒(méi)有找到用戶,則應(yīng)該返回 None。

需要注意的是,該函數(shù)默認(rèn)接收一個(gè)參數(shù),就是用戶的 ID。如果要接收其他參數(shù),可以通過(guò)閉包(closure)或者全局變量來(lái)傳遞參數(shù),例如下面這種方式:

some_variable = 'xiangpica'

@login_manager.user_loader
def load_user(user_id):
    return User.query.filter_by(id=user_id,name=some_variable).first()

另外還可以再次封裝函數(shù)然后傳入?yún)?shù),例如:

def user_loader_fn(some_variable):
    @login_manager.user_loader
    def load_user(user_id):
        return User.query.filter_by(id=user_id,some_variable=some_variable).first()
    return load_user

some_variable = 'xiangpica'
load_user = user_loader_fn(some_variable)

login_user 函數(shù)

該函數(shù)是 Flask-Login 提供的一個(gè)函數(shù),用來(lái)登錄用戶。這個(gè)函數(shù)需要接受一個(gè)用戶對(duì)象作為參數(shù)。

在上面的示例代碼中,當(dāng)驗(yàn)證用戶密碼成功后,會(huì)調(diào)用 login_user(user) 函數(shù)登錄用戶。這個(gè)函數(shù)會(huì)將用戶對(duì)象存儲(chǔ)到會(huì)話中,并標(biāo)記用戶已經(jīng)登錄。在后續(xù)的請(qǐng)求中,可以使用 current_user 變量來(lái)訪問(wèn)當(dāng)前登錄的用戶。

login_user() 函數(shù)原型如下:

login_user(user, remember=False, duration=None, force=False, fresh=True)

其參數(shù)說(shuō)明如下:

  • remember:布爾值,表示是否記住用戶,默認(rèn) False;
  • duration:datetime.timedelta 對(duì)象,用戶登錄的時(shí)間,默認(rèn)為 None;
  • force:布爾值,表示是否強(qiáng)制登錄用戶,即使用戶已經(jīng)登錄,默認(rèn)為 False;
  • fresh:布爾值,表示用戶登錄后是否需要獲取新的權(quán)限, 默認(rèn)為 True。

這個(gè)函數(shù)在登錄用戶之后會(huì)在 session 中記錄用戶的狀態(tài),使得之后的請(qǐng)求都能識(shí)別出這個(gè)用戶已經(jīng)登錄。

login_user() 函數(shù)還會(huì)在用戶登錄后設(shè)置一個(gè) cookie, 以便在后續(xù)請(qǐng)求中識(shí)別用戶身份。這個(gè) cookie 的名稱是 remember_token, 如果你指定了 remember=True,則會(huì)將該 cookie 的過(guò)期時(shí)間設(shè)置為 REMEMBER_COOKIE_DURATION, 否則將在會(huì)話結(jié)束后過(guò)期。

logout_user 函數(shù)

該函數(shù)是 Flask-Login 提供的一個(gè)函數(shù),用來(lái)注銷當(dāng)前登錄的用戶。這個(gè)函數(shù)無(wú)需接受任何參數(shù),因?yàn)樗鼤?huì)清除當(dāng)前會(huì)話中存儲(chǔ)的用戶信息。

使用方法很簡(jiǎn)單,只需要在需要注銷的地方直接調(diào)用 logout_user() 函數(shù)即可。

from flask_login import logout_user
@app.route('/logout')
def logout():
    logout_user()
    return redirect(url_for('index'))

調(diào)用 logout_user() 函數(shù)會(huì)刪除會(huì)話中存儲(chǔ)的用戶信息,并且會(huì)刪除 remember_token 的 cookie, 從而使用戶登出。

在注銷用戶后,應(yīng)用程序應(yīng)重定向用戶到登錄頁(yè)面或主頁(yè)面。用戶注銷后,可以使用 current_user 變量來(lái)確定用戶是否已經(jīng)注銷。如果用戶已經(jīng)注銷,則 current_user 是一個(gè)匿名用戶。

confirm_login 函數(shù)

該函數(shù)是 Flask-Login 提供的一個(gè)函數(shù),用于確認(rèn)用戶登錄狀態(tài)。在某些場(chǎng)景中,用戶可能被提示登錄后才能執(zhí)行某些操作。在這種場(chǎng)景中,可以使用 confirm_login() 函數(shù)來(lái)確認(rèn)用戶是否已經(jīng)登錄。

該函數(shù)需要接收一個(gè)參數(shù),是當(dāng)前登錄用戶的 ID。當(dāng)用戶登錄后,會(huì)在會(huì)話中存儲(chǔ)用戶 ID。如果用戶已經(jīng)登錄,則會(huì)話中會(huì)有 user_id 的值,該函數(shù)會(huì)根據(jù)這個(gè)值來(lái)確認(rèn)用戶是否已經(jīng)登錄。

from flask_login import confirm_login
@app.route('/school')
def settings():
    if not confirm_login():
        return redirect(url_for('login'))
    return render_template('school.html')

這樣就可以在訪問(wèn) “/settings” 路徑時(shí)確認(rèn)用戶是否已經(jīng)登錄,如果沒(méi)有登錄則重定向到登錄頁(yè)面。

這里需要注意:如果在用戶登錄之后沒(méi)有將用戶 ID 記錄到會(huì)話中,那么 Flask-Login 的 confirm_login() 函數(shù)就無(wú)法確認(rèn)用戶是否已經(jīng)登錄。

unauthorized_callback 函數(shù)

該函數(shù)用于在用戶訪問(wèn)被保護(hù)的視圖函數(shù)時(shí)被拒絕授權(quán)時(shí)被調(diào)用?;卣{(diào)函數(shù)默認(rèn)是 None,如果你設(shè)置了該回調(diào)函數(shù), 則在用戶未登錄或者沒(méi)有權(quán)限訪問(wèn)時(shí),會(huì)調(diào)用這個(gè)函數(shù)。

默認(rèn)的 Flask-Login 實(shí)現(xiàn)會(huì)拋出一個(gè) unauthorized 的異常,你可以在回調(diào)函數(shù)里面定制自己的錯(cuò)誤處理. 例如:

from flask_login import LoginManager
login_manager = LoginManager()

@login_manager.unauthorized_handler
def unauthorized():
    return '登錄后訪問(wèn)該頁(yè)面'

上面的代碼在訪問(wèn)被保護(hù)視圖時(shí)會(huì)自動(dòng)調(diào)用 unauthorized() 函數(shù),返回 '登錄后訪問(wèn)該頁(yè)面' 錯(cuò)誤信息。

needs_refresh_callback 函數(shù)

該函數(shù)在用戶的認(rèn)證信息需要刷新時(shí)會(huì)被調(diào)用,默認(rèn)返回值是 None。
當(dāng)用戶登錄后, 一般會(huì)在會(huì)話中存儲(chǔ)一些用戶信息, 比如用戶名, 角色等等。當(dāng)用戶認(rèn)證信息有變化時(shí), 例如用戶角色被更新了,就需要重新加載用戶信息。

如果你設(shè)置了 needs_refresh_callback 函數(shù),當(dāng)用戶的認(rèn)證信息需要刷新時(shí), 會(huì)調(diào)用這個(gè)函數(shù)來(lái)重新加載用戶信息。

from flask_login import LoginManager
login_manager = LoginManager()

@login_manager.unauthorized_handler
def unauthorized():
    return '登錄后訪問(wèn)該頁(yè)面'

login_required 裝飾器

該裝飾器用來(lái)保護(hù)視圖函數(shù),確保只有登錄用戶才能訪問(wèn)。如果一個(gè)用戶沒(méi)有登錄,將會(huì)重定向到登錄頁(yè)面。
使用方法很簡(jiǎn)單,只需要在需要保護(hù)的視圖函數(shù)的前面加上 @login_required 即可。例如:

from flask_login import login_required

@app.route('/school')
@login_required
def settings():
    return render_template('school.html')

默認(rèn)情況下, 重定向地址是 login, 如果你有其他路徑名稱,可以使用 login_url 參數(shù)來(lái)設(shè)置重定向地址。例如:

@app.route('/school')
@login_required(login_url='/signin')
def settings():
    return render_template('school.html')

還可以使用 next 參數(shù)來(lái)設(shè)置登錄成功后的重定向地址。例如:

@app.route('/login', methods=['GET', 'POST'])
def login():
    next = request.args.get('next')
    if request.method == 'POST':
        # check login
        login_user(user)
        return redirect(next or url_for('index'))
    return render_template('login.html', next=next)

這樣在登錄成功后會(huì)重定向回之前的頁(yè)面。

flask_login模塊

flask-login為flask提供了用戶會(huì)話管理。他處理了日常的登入,登出并且長(zhǎng)時(shí)間記住用戶的會(huì)話。

  • 在會(huì)話中存儲(chǔ)當(dāng)前活躍的用戶ID讓你能夠自由地登入和登出。

  • 讓你限制登入或登出,用戶可以訪問(wèn)的試圖。

  • 處理讓人棘手的記住我功能。

  • 幫助你保護(hù)用戶會(huì)話免遭cookie被盜的牽連。

  • .可以與以后可能使用的flask-principal或其他認(rèn)證擴(kuò)展集成。

到此這篇關(guān)于Python flask 框架使用 flask-login 模塊的文章就介紹到這了,更多相關(guān)Python flask-login 模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論