<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Flask-Login 是一個 Flask 模組,可以為 Flask 應用程式提供使用者登入功能。要在 Flask 應用程式中使用 Flask-Login,需要先安裝它:
pip install flask-login
這了有個小細節需要注意,模組安裝都使用中劃線(-),模組使用時用下劃線 _
在應用程式中匯入並初始化 Flask-Login:
from flask import Flask from flask_login import LoginManager app = Flask(__name__) login_manager = LoginManager(app)
上述程式碼中提及了 LoginManager 類,該類是 Flask-Login 提供的主要入口點,用於管理使用者登入狀態。在你的 Flask 應用程式中初始化它。
然後我們可以使用 init_app() 函數來初始化 LoginManager 範例並繫結到指定的 Flask 應用上。這樣就可以在應用程式中使用該範例來管理使用者登入狀態。
一些常用的設定項:
在上面的範例中,我們沒有指定登入頁面,系統會預設使用 “login” 作為登入頁面,如果需要指定其他頁面,可以在初始化後設定 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': # 登入校驗程式碼 username = request.form['username'] password = request.form['password'] user = load_user(username) # 注意 user.verify_password 是自定義函數,用來校驗密碼是否正確 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'))
user_loader() 函數是 Flask-Login 提供的一個裝飾器,用來設定一個回撥函數,用來載入使用者。這個函數需要接收一個使用者 ID 作為引數,並返回一個使用者物件。
@login_manager.user_loader def load_user(user_id): # 從資料庫或者其他儲存位置 讀取使用者資訊 user = list() return user
使用了該裝飾器之後,每當 Flask-Login 需要載入使用者時,都會呼叫這個回撥函數,並傳入使用者 ID 作為引數。該函數應該根據使用者 ID 從資料庫或其他儲存中載入使用者,並返回使用者物件。如果沒有找到使用者,則應該返回 None。
需要注意的是,該函數預設接收一個引數,就是使用者的 ID。如果要接收其他引數,可以通過閉包(closure)或者全域性變數來傳遞引數,例如下面這種方式:
some_variable = 'xiangpica' @login_manager.user_loader def load_user(user_id): return User.query.filter_by(id=user_id,name=some_variable).first()
另外還可以再次封裝函數然後傳入引數,例如:
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)
該函數是 Flask-Login 提供的一個函數,用來登入使用者。這個函數需要接受一個使用者物件作為引數。
在上面的範例程式碼中,當驗證使用者密碼成功後,會呼叫 login_user(user) 函數登入使用者。這個函數會將使用者物件儲存到對談中,並標記使用者已經登入。在後續的請求中,可以使用 current_user 變數來存取當前登入的使用者。
login_user() 函數原型如下:
login_user(user, remember=False, duration=None, force=False, fresh=True)
其引數說明如下:
這個函數在登入使用者之後會在 session 中記錄使用者的狀態,使得之後的請求都能識別出這個使用者已經登入。
login_user() 函數還會在使用者登入後設定一個 cookie, 以便在後續請求中識別使用者身份。這個 cookie 的名稱是 remember_token, 如果你指定了 remember=True,則會將該 cookie 的過期時間設定為 REMEMBER_COOKIE_DURATION, 否則將在對談結束後過期。
該函數是 Flask-Login 提供的一個函數,用來登出當前登入的使用者。這個函數無需接受任何引數,因為它會清除當前對談中儲存的使用者資訊。
使用方法很簡單,只需要在需要登出的地方直接呼叫 logout_user() 函數即可。
from flask_login import logout_user @app.route('/logout') def logout(): logout_user() return redirect(url_for('index'))
呼叫 logout_user() 函數會刪除對談中儲存的使用者資訊,並且會刪除 remember_token 的 cookie, 從而使使用者登出。
在登出使用者後,應用程式應重定向使用者到登入頁面或主頁面。使用者登出後,可以使用 current_user 變數來確定使用者是否已經登出。如果使用者已經登出,則 current_user 是一個匿名使用者。
該函數是 Flask-Login 提供的一個函數,用於確認使用者登入狀態。在某些場景中,使用者可能被提示登入後才能執行某些操作。在這種場景中,可以使用 confirm_login() 函數來確認使用者是否已經登入。
該函數需要接收一個引數,是當前登入使用者的 ID。當用戶登入後,會在對談中儲存使用者 ID。如果使用者已經登入,則對談中會有 user_id 的值,該函數會根據這個值來確認使用者是否已經登入。
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')
這樣就可以在存取 “/settings” 路徑時確認使用者是否已經登入,如果沒有登入則重定向到登入頁面。
這裡需要注意:如果在使用者登入之後沒有將使用者 ID 記錄到對談中,那麼 Flask-Login 的 confirm_login() 函數就無法確認使用者是否已經登入。
該函數用於在使用者存取被保護的檢視函數時被拒絕授權時被呼叫。回撥函數預設是 None,如果你設定了該回撥函數, 則在使用者未登入或者沒有許可權存取時,會呼叫這個函數。
預設的 Flask-Login 實現會丟擲一個 unauthorized 的異常,你可以在回撥函數裡面客製化自己的錯誤處理. 例如:
from flask_login import LoginManager login_manager = LoginManager() @login_manager.unauthorized_handler def unauthorized(): return '登入後存取該頁面'
上面的程式碼在存取被保護檢視時會自動呼叫 unauthorized() 函數,返回 '登入後存取該頁面' 錯誤資訊。
該函數在使用者的認證資訊需要重新整理時會被呼叫,預設返回值是 None。
當用戶登入後, 一般會在對談中儲存一些使用者資訊, 比如使用者名稱, 角色等等。當用戶認證資訊有變化時, 例如使用者角色被更新了,就需要重新載入使用者資訊。
如果你設定了 needs_refresh_callback 函數,當用戶的認證資訊需要重新整理時, 會呼叫這個函數來重新載入使用者資訊。
from flask_login import LoginManager, current_user login_manager = LoginManager() @login_manager.needs_refresh_handler def refresh_user(): current_user.load_data()
該裝飾器用來保護檢視函數,確保只有登入使用者才能存取。如果一個使用者沒有登入,將會重定向到登入頁面。
使用方法很簡單,只需要在需要保護的檢視函數的前面加上 @login_required 即可。例如:
from flask_login import login_required @app.route('/school') @login_required def settings(): return render_template('school.html')
預設情況下, 重定向地址是 login, 如果你有其他路徑名稱,可以使用 login_url 引數來設定重定向地址。例如:
@app.route('/school') @login_required(login_url='/signin') def settings(): return render_template('school.html')
還可以使用 next 引數來設定登入成功後的重定向地址。例如:
@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)
到此這篇關於詳解Flask框架中Flask-Login模組的使用的文章就介紹到這了,更多相關Flask框架Flask-Login內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45