Flask擴展推薦:Flask-SQLAlchemy與用戶認證

爲什麼需要Flask擴展?

Flask是一個輕量級的Python Web框架,它本身只提供了最基礎的功能,比如路由、模板渲染等。當我們需要更復雜的功能,比如連接數據庫、處理用戶認證、實現表單驗證等,就需要藉助擴展(Extensions) 來完成。這些擴展由社區開發,封裝了常用的功能,讓我們不需要從零開始編寫代碼,能更快地構建應用。

Flask-SQLAlchemy:簡化數據庫操作

在Web應用中,數據存儲是核心功能之一。Flask-SQLAlchemy是一個將SQLAlchemy(一個強大的ORM庫)集成到Flask中的擴展,它讓我們可以用Python對象的方式操作數據庫,而不用直接編寫SQL語句。

安裝

pip install flask-sqlalchemy

基本配置

在Flask應用中初始化SQLAlchemy,並配置數據庫:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
# 配置數據庫URI(這裏用SQLite,適合開發測試)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
# 關閉SQLAlchemy的修改跟蹤功能(減少資源消耗)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 初始化SQLAlchemy實例
db = SQLAlchemy(app)

定義數據模型

以用戶認證爲例,創建一個User模型存儲用戶信息:

class User(db.Model):
    __tablename__ = 'users'  # 表名
    id = db.Column(db.Integer, primary_key=True)  # 主鍵
    username = db.Column(db.String(80), unique=True, nullable=False)  # 用戶名
    password_hash = db.Column(db.String(128), nullable=False)  # 加密後的密碼

數據庫操作

  • 創建表:在應用啓動時執行db.create_all()創建所有表(需在with app.app_context():中運行):
  with app.app_context():
      db.create_all()  # 創建數據庫表
  • 添加用戶
  new_user = User(username='testuser', password_hash='hashed_password')
  db.session.add(new_user)  # 添加到會話
  db.session.commit()  # 提交事務,保存到數據庫
  • 查詢用戶
  user = User.query.filter_by(username='testuser').first()  # 查詢用戶名匹配的用戶
  if user:
      print(f"找到用戶:{user.username}")
  • 更新/刪除用戶
  # 更新
  user = User.query.get(1)
  user.username = 'newusername'
  db.session.commit()

  # 刪除
  user = User.query.get(1)
  db.session.delete(user)
  db.session.commit()

用戶認證:Flask-Login與安全存儲

用戶認證的核心是驗證身份保持登錄狀態。Flask-Login是一個專門處理用戶會話、登錄狀態管理的擴展,配合數據庫存儲用戶信息,就能快速實現登錄、登出功能。

安裝Flask-Login

pip install flask-login

配置Flask-Login

初始化LoginManager並設置用戶加載函數:

from flask_login import LoginManager, login_user, login_required, logout_user, current_user

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'  # 未登錄時跳轉的登錄頁面路由

# 用戶加載函數:根據用戶ID查詢用戶(必須實現)
@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))  # 通過ID查詢用戶

密碼安全存儲

密碼絕對不能明文存儲!使用Werkzeug的generate_password_hashcheck_password_hash加密:

from werkzeug.security import generate_password_hash, check_password_hash

class User(db.Model):
    # 新增密碼加密方法
    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)  # 驗證密碼

登錄與登出功能

  • 登錄視圖:驗證用戶並保持會話:
  @app.route('/login', methods=['GET', 'POST'])
  def login():
      if request.method == 'POST':
          username = request.form.get('username')
          password = request.form.get('password')
          user = User.query.filter_by(username=username).first()

          if user and user.check_password(password):
              login_user(user)  # 登錄成功,維護會話
              return redirect(url_for('dashboard'))
          else:
              return "用戶名或密碼錯誤"

      # GET請求:顯示登錄表單
      return '''
          <form method="POST">
              <input type="text" name="username" placeholder="用戶名"><br>
              <input type="password" name="password" placeholder="密碼"><br>
              <button type="submit">登錄</button>
          </form>
      '''
  • 登出視圖
  @app.route('/logout')
  @login_required  # 僅登錄用戶可訪問
  def logout():
      logout_user()  # 登出用戶,清除會話
      return redirect(url_for('index'))

保護路由

@login_required裝飾器保護需要登錄的頁面:

@app.route('/dashboard')
@login_required
def dashboard():
    return f"歡迎,{current_user.username}!"  # current_user是當前登錄用戶

總結

通過Flask-SQLAlchemy和Flask-Login這兩個擴展,我們可以快速實現一個帶有數據庫和用戶認證的Web應用:

  • Flask-SQLAlchemy:通過Python對象操作數據庫,無需寫SQL,簡化數據增刪改查。
  • Flask-Login:處理用戶會話、登錄狀態,配合密碼加密,實現安全的登錄/登出功能。

初學者只需掌握基礎的安裝、配置和核心API(如db.create_all()login_user()logout_user()),就能快速構建用戶系統。生產環境中還需考慮HTTPS、CSRF防護等安全問題,後續可學習Flask-WTF(表單驗證)、Flask-Security等擴展完善應用。

小夜