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等扩展完善应用。

小夜