Flask 是一个轻量级的 Python Web 框架,核心功能非常精简,但其强大的扩展生态使得开发者能够轻松构建复杂的 Web 应用。Flask 扩展可以为应用添加数据库 ORM、表单验证、用户认证等功能,让开发更加高效。
本文将介绍几个常用的 Flask 扩展,并演示它们的基本使用方法,包括:
- Flask-SQLAlchemy(ORM 数据库操作)
- Flask-WTF(表单处理)
- Flask-Login(用户身份验证)
1. Flask-SQLAlchemy:数据库 ORM 操作
Flask-SQLAlchemy 是 Flask 官方推荐的 ORM 扩展,它基于 SQLAlchemy,可以让你更方便地管理数据库,而无需手写 SQL 语句。
安装 Flask-SQLAlchemy
pip install flask-sqlalchemy
配置 Flask-SQLAlchemy
在 app.py
中配置数据库连接(以 SQLite 为例):
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db' # 使用 SQLite 数据库
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
定义数据模型
使用 SQLAlchemy 定义数据模型(如用户表):
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return f'<User {self.username}>'
创建数据库表
with app.app_context():
db.create_all()
数据库操作示例
添加数据
new_user = User(username='Alice', email='alice@example.com')
db.session.add(new_user)
db.session.commit()
查询数据
user = User.query.filter_by(username='Alice').first()
print(user.email)
更新数据
user.email = 'newalice@example.com'
db.session.commit()
删除数据
db.session.delete(user)
db.session.commit()
2. Flask-WTF:表单处理与验证
Flask-WTF 是基于 WTForms 的 Flask 扩展,它简化了表单的创建、验证和 CSRF 保护。
安装 Flask-WTF
pip install flask-wtf
配置 Flask-WTF
在 app.py
中配置 CSRF 保护:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Email
app.config['SECRET_KEY'] = 'your_secret_key' # 必须设置 SECRET_KEY 以启用 CSRF 保护
创建表单类
定义一个用户登录表单:
class LoginForm(FlaskForm):
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
submit = SubmitField('Login')
在视图函数中处理表单
from flask import render_template, request
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
email = form.email.data
password = form.password.data
return f'Login successful for {email}'
return render_template('login.html', form=form)
在模板中渲染表单
在 templates/login.html
中:
<form method="POST">
{{ form.hidden_tag() }} <!-- CSRF 令牌 -->
<p>{{ form.email.label }} {{ form.email() }}</p>
<p>{{ form.password.label }} {{ form.password() }}</p>
<p>{{ form.submit() }}</p>
</form>
这样,我们就完成了一个简单的登录表单,并使用 Flask-WTF 进行表单验证。
3. Flask-Login:用户身份验证
Flask-Login 是 Flask 的用户认证扩展,它提供了用户登录、登出和会话管理功能。
安装 Flask-Login
pip install flask-login
配置 Flask-Login
在 app.py
中初始化 Flask-Login:
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
login_manager = LoginManager(app)
login_manager.login_view = 'login'
创建用户模型
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password = db.Column(db.String(120), nullable=False)
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
用户登录
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.email.data).first()
if user and user.password == form.password.data: # 这里应该使用哈希加密验证
login_user(user)
return 'Login successful'
return render_template('login.html', form=form)
保护路由(需要登录)
@app.route('/dashboard')
@login_required
def dashboard():
return f'Welcome, {current_user.username}!'
用户登出
@app.route('/logout')
@login_required
def logout():
logout_user()
return 'You have been logged out.'
这样,我们就完成了用户登录、登出和访问保护功能。
4. 其他常见 Flask 扩展
除了上面介绍的 Flask-SQLAlchemy、Flask-WTF 和 Flask-Login,Flask 还有许多其他常用扩展:
Flask 扩展 | 功能 |
---|---|
Flask-Migrate | 数据库迁移管理(基于 Alembic) |
Flask-Mail | 发送邮件功能 |
Flask-Caching | 缓存管理,提高应用性能 |
Flask-RESTful | 构建 REST API |
Flask-JWT-Extended | 使用 JWT 进行身份验证 |
Flask 之所以流行,除了其轻量级和易用性外,还因为其丰富的扩展生态,使开发者能够轻松地集成数据库、表单验证、用户认证等功能。
- Flask-SQLAlchemy:简化数据库操作,提供 ORM 功能
- Flask-WTF:处理表单数据并进行验证
- Flask-Login:用户身份验证和会话管理
如果你正在开发 Flask Web 应用,掌握这些扩展能够让你更高效地构建安全、健壮的应用。
如果你有任何问题或建议,欢迎在评论区交流! 🚀
更多请关注wx公众号 “学GIS的小宝同学”