为什么需要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_hash和check_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等扩展完善应用。