由於官方的flask_login 是基於用戶ID來存儲當前登錄用戶的,如官方demo:
如果有多個用戶角色,比如有父賬戶和子賬戶,在同一個瀏覽器下,父賬號登陸了,此時訪問子賬號的後臺,也是登錄狀態,因爲是基於ID來查詢用戶的,當然也可以讓2個角色的用戶ID不衝突,或者參考 flask_login_multi
我的需求也是實現用戶後臺登錄不衝突,登陸了父賬戶,即使子賬戶存在同樣的用戶ID,訪問子後臺,任需登錄,於是產生了一下解決辦法,
@login_manager.user_loader
def load_user(user_id):
session_blueprint = session.get('blueprint')
if session_blueprint == request.blueprint == 'sub':
sub_user = SubUser.query.get(int(user_id))
return sub_user
elif session_blueprint == request.blueprint == 'home':
home_user = User.query.get(int(user_id))
return home_user
else:
return None
另外在父賬戶登錄時設置:
# 記錄當前登錄的endpoint
session['blueprint'] = request.blueprint
子賬戶同理:
# 記錄當前登錄的endpoint
session['blueprint'] = request.blueprint
由於登錄的時候纔會設置這個值,所以當你登錄了父賬戶,輸入子賬戶的後臺鏈接,
session_blueprint == request.blueprint == 'sub':
session_blueprint=home,判斷不成立,
session_blueprint == request.blueprint == 'home'
而 request.blueprint=sub ,同樣判斷不成立
返回None,則跳轉到登錄頁,避免了因賬戶ID相同產生未登錄也能訪問後臺的BUG。
以上!