[python][flask]Flask-Login 使用詳解

1. 簡介

Flask-Login 是 Flask 的一個擴展,專門用于處理用戶認證相關的功能。它提供了用戶會話管理、登錄/注銷視圖、記住我功能等常見認證需求,讓開發者能夠快速實現安全的用戶認證系統。

2. 安裝與基礎配置

首先,需要安裝 Flask-Login:

pip install flask-login

然后在 Flask 應用中進行基礎配置:

from flask import Flask
from flask_login import LoginManagerapp = Flask(__name__)
app.secret_key = 'your_secret_key'  # 用于加密會話數據,生產環境中應使用強密鑰# 初始化 LoginManager
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'  # 未登錄用戶重定向的登錄頁面路由

?

3. 用戶模型要求

Flask-Login 要求用戶模型實現以下幾個屬性和方法:

  • is_authenticated:是否通過驗證

  • is_active:是否是活動用戶

  • is_anonymous:是否是匿名用戶

  • get_id():返回用戶的唯一標識

可以通過繼承 UserMixin 來快速實現這些方法:

from flask_login import UserMixin
from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()class User(UserMixin, db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True)password_hash = db.Column(db.String(128))def set_password(self, password):self.password_hash = generate_password_hash(password)def check_password(self, password):return check_password_hash(self.password_hash, password)

?

4. 用戶加載器

需要定義一個用戶加載函數,該函數接收用戶 ID 字符串,并返回對應的用戶對象:

@login_manager.user_loader
def load_user(user_id):return User.query.get(int(user_id))

?

5. 登錄與注銷功能
5.1 登錄視圖

在登錄視圖中,使用 login_user() 函數建立用戶會話:

from flask import request, redirect, url_for
from flask_login import login_user@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':username = request.form['username']password = request.form['password']user = User.query.filter_by(username=username).first()if user and user.check_password(password):login_user(user, remember=True)  # remember 參數用于“記住我”功能return redirect(url_for('dashboard'))else:return 'Invalid credentials'return 'Login Form'

?

5.2 注銷視圖

在注銷視圖中,使用 logout_user() 清除用戶會話:

from flask_login import logout_user@app.route('/logout')
@login_required  # 確保只有登錄用戶能訪問
def logout():logout_user()return redirect(url_for('login'))

?

6. 保護視圖與訪問控制
6.1 基本視圖保護

使用 @login_required 裝飾器限制只有登錄用戶能訪問:

from flask_login import login_required@app.route('/dashboard')
@login_required
def dashboard():return 'Welcome to the dashboard!'

?

6.2 基于角色的訪問控制

可以通過自定義裝飾器實現更細粒度的訪問控制:

from functools import wraps
from flask import abortdef role_required(role):def decorator(f):@wraps(f)def decorated_function(*args, **kwargs):if not current_user.is_authenticated or current_user.role != role:abort(403)return f(*args, **kwargs)return decorated_functionreturn decorator@app.route('/admin')
@login_required
@role_required('admin')
def admin_dashboard():return 'Welcome to the admin dashboard!'

?

7. 記住我功能

Flask-Login 的“記住我”功能默認已經啟用,由 login_user()remember 參數控制。啟用后會在瀏覽器設置持久 cookie,即使關閉瀏覽器,用戶仍然保持登錄狀態。

8. 自定義未授權處理

可以通過自定義 unauthorized_callback 來處理未授權的請求:

@login_manager.unauthorized_handler
def unauthorized():return 'You must be logged in to view this page', 401

?

9. 用戶會話保護

Flask-Login 提供三種會話保護級別:

  • None:禁用會話保護

  • basic(默認):記錄用戶代理和 IP

  • strong:每次登錄生成新會話 ID,防止會話固定攻擊

login_manager.session_protection = 'strong'

?

10. 總結

Flask-Login 提供了以下核心功能:

  1. 簡潔的用戶模型接口:通過 UserMixin 快速實現所需方法。

  2. 完整的會話管理:處理登錄、注銷和會話持久化。

  3. 視圖保護:通過裝飾器輕松限制訪問。

  4. 安全特性:包括密碼哈希、會話保護和 CSRF 防御。

  5. 靈活性:可以輕松集成到任何用戶存儲系統

在實際項目中使用 Flask-Login 時,建議:

  • 始終使用 HTTPS 保護認證數據。

  • 定期更新依賴庫以獲取安全修復。

  • 對于復雜需求,可以結合 Flask-Principal 等擴展。

  • 在生產環境中使用強密碼哈希算法(如 bcrypt)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90810.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90810.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90810.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【WebGPU學習雜記】WebAssembly中的relaxed_madd指令到底做了什么?

relaxed_madd 這條指令到底做了什么核心&#xff1a;relaxed_madd 是一個分量級別 (Component-wise) 的操作 首先&#xff0c;最重要的一點是&#xff1a;v128.relaxed_madd<f32>(a, b, c) 不是矩陣乘法。它是一個在三個向量 a, b, c 之間進行的、逐個分量的、并行的融合…

【全新上線】境內 Docker 鏡像狀態監控

境內 Docker 鏡像狀態監控&#xff1a;您的 Docker 加速伴侶 在當今云計算和容器化技術飛速發展的時代&#xff0c;Docker 已成為開發者不可或缺的工具。然而&#xff0c;對于身處國內的用戶而言&#xff0c;訪問境外 Docker Hub 等鏡像倉庫時常會遭遇網絡延遲和連接不穩定的困…

Visual Studio中部署PaddleOCRv5 (借助ncnn框架)

PaddleOCRv5_ncnn PaddleOCRv5 在Visual Studio中進行圖片OCR檢測&#xff08;ncnn框架open-mobile實現)&#xff0c;嘗試對nihui的ncnn-android-ppocrv5檢測算法的剝離與移植。 本項目Github鏈接如下&#xff1a;PaddleOCRv5_ncnn 寫在前面 本倉庫代碼是基于nihui的ncnn-a…

中級全棧工程師筆試題

解釋ACID特性&#xff0c;如何在node.js中實現事務操作針對React單頁應用&#xff0c;請提供至少5種性能優化方案&#xff0c;并解釋其原理&#xff1a; 減少首屏加載時間優化渲染性能資源加載策略狀態管理優化代碼分割方案 如何防止以下攻擊&#xff1a; JWT令牌挾持Graph QL查…

Windows---動態鏈接庫Dynamic Link Library(.dll)

DLL的“幕后英雄”角色 在Windows操作系統的生態中&#xff0c;有一類文件始終扮演著“幕后英雄”的角色——它們不像.exe文件那樣直接呈現為用戶可見的程序窗口&#xff0c;卻支撐著幾乎所有應用程序的運行&#xff1b;它們不單獨執行&#xff0c;卻承載著系統與軟件的核心功…

深入分析計算機網絡傳輸層和應用層面試題

三、傳輸層面試題&#xff08;Transmission Layer&#xff09;傳輸層位于 OSI 七層模型的第四層&#xff0c;它的核心任務是為兩個主機之間的應用層提供可靠的數據傳輸服務。它不僅承擔了數據的端到端傳輸&#xff0c;而且還實現了諸如差錯檢測、數據流控制、擁塞控制等機制&am…

【RH134 問答題】第 2 章 調度未來任務

目錄crontab 文件中的用戶作業時間格式怎么解釋&#xff1f;如果需要以當前用戶身份計劃周期性作業&#xff0c;在上午 8 點到晚上 9 點之間每兩分鐘一次輸出當前日期和時間&#xff0c;該作業只能在周一到周五運行&#xff0c;周六或周日不能運行。要怎么做&#xff1f;要計劃…

【ee類保研面試】通信類---信息論

25保研er&#xff0c;希望將自己的面試復習分享出來&#xff0c;供大家參考 part0—英語類 part1—通信類 part2—信號類 part3—高數類 part100—self項目準備 文章目錄**面試復習總綱****Chap2: 熵、相對熵和互信息 (Entropy, Relative Entropy, and Mutual Information)****…

vue2+node+express+MongoDB項目安裝啟動啟動

文章目錄 準備環境 安裝MongoDB 安裝 MongoDB Compass(圖形化數據庫管理工具) 安裝 Postman(接口測試工具) 項目結構 配置項目代理 項目啟動 提交項目 生成Access Token 準備環境 默認含有node.js、npm 安裝MongoDB 下載地址:https://www.mongodb.com/try/download/com…

JavaEE初階第十二期:解鎖多線程,從 “單車道” 到 “高速公路” 的編程升級(十)

專欄&#xff1a;JavaEE初階起飛計劃 個人主頁&#xff1a;手握風云 目錄 一、多線程案例 1.1. 定時器 一、多線程案例 1.1. 定時器 定時器是軟件開發的一個重要組件&#xff0c;是一種能夠按照預設的時間間隔或在特定時間點執行某個任務或代碼片段的機制。你可以把它想象成…

EDoF-ToF: extended depth of field time-of-flight imaging解讀, OE 2021

1. 核心問題&#xff1a;iToF相機的“景深”死穴我們之前已經詳細討論過&#xff0c;iToF相機的“景深”&#xff08;有效測量范圍&#xff09;受到光學散焦的嚴重制約。問題根源&#xff1a; 當iToF相機的鏡頭散焦時&#xff0c;來自場景不同深度的光信號會在傳感器像素上發生…

符號引用與直接引用:概念對比與實例解析

符號引用與直接引用&#xff1a;概念對比與實例解析 符號引用和直接引用是Java虛擬機(JVM)中類加載與執行機制的核心概念&#xff0c;理解它們的區別與聯系對于深入掌握Java運行原理至關重要。下面我將從定義、特性、轉換過程到實際應用&#xff0c;通過具體示例全面比較這兩類…

每日一講——Podman

一、概念1、定義與定位Podman&#xff08;Pod Manager&#xff09;是符合OCI標準的容器引擎&#xff0c;用于管理容器、鏡像及Pod&#xff08;多容器組&#xff09;。它無需守護進程&#xff08;Daemonless&#xff09;&#xff0c;直接通過Linux內核功能&#xff08;如命名空間…

Spring Boot DFS、HDFS、AI、PyOD、ECOD、Junit、嵌入式實戰指南

Spring Boot分布式文件系統 以下是一些關于Spring Boot分布式文件系統(DFS)的實現示例和關鍵方法,涵蓋了不同場景和技術的應用。這些示例可以幫助理解如何在Spring Boot中集成DFS(如HDFS、MinIO、FastDFS等)或模擬分布式存儲。 使用Spring Boot集成HDFS 基礎配置 // 配…

解決GoLand運行go程序報錯:Error: Cannot find package xxx 問題

問題描述 一個簡單的go程序&#xff0c;代碼如下 package mainimport "fmt" func main() {// 占位符&#xff0c;和java的String.format用法一樣fmt.Printf("我%d歲&#xff0c;我叫%s", 18, "yexindong") }結構如下當我想要運行時卻報錯 Error:…

Spring MVC設計精粹:源碼級架構解析與實踐指南

文章目錄一、設計哲學&#xff1a;分層與解耦1. 前端控制器模式2. 分層架構設計二、核心組件源碼解析1. DispatcherServlet - 九大組件初始化2. DispatcherServlet - 前端控制器&#xff08;請求處理中樞&#xff09;請求源碼入口&#xff1a;FrameworkServlet#doGet()請求委托…

k8s之控制器詳解

1.deployment&#xff1a;適用于無狀態服務1.功能(1)創建高可用pod&#xff08;2&#xff09;滾動升級/回滾&#xff08;3&#xff09;平滑擴容和縮容2.操作命令&#xff08;1&#xff09;回滾# 回滾到上一個版本 kubectl rollout undo deployment/my-app# 回滾到特定版本&…

.NET Core中的配置系統

傳統配置方式文件Web.config 進行配置。ConfigurationManager類配置。.NET配置系統中支持配置方式文件配置&#xff08;json、xml、ini等&#xff09;注冊表環境變量命令行自定義配置源Json文件配置方式實現步驟&#xff1a;創建一個json文件&#xff0c;把文件設置 為“如果較…

kafka的消費者負載均衡機制

Kafka 的消費者負載均衡機制是保證消息高效消費的核心設計&#xff0c;通過將分區合理分配給消費者組內的消費者&#xff0c;實現并行處理和負載均衡。以下從核心概念、分配策略、重平衡機制等方面詳細講解。一、核心概念理解消費者負載均衡前&#xff0c;需明確三個關鍵概念&a…

騰訊云edges on部署pages

騰訊云edges on部署pages適用場景部署方式官方文檔 適用場景 Next.js Hexo 以及用React Vue等現代前端框架構建的單頁應用全棧項目開發 通過Pages Function KV等能力 實現輕量化的動態服務快速部署與迭代 通過Github等代碼管理平臺集成 每次代碼提交時自動構建和部署網站 注…