Flask 入门:轻量级 Python Web 框架的快速上手
Flask 入门:轻量级 Python Web 框架的快速上手
今天我们来深入探讨 Flask,一个轻量、灵活且易于上手的 Python Web 开发框架。Flask 以其简洁的设计、模块化的扩展能力和快速开发特性,成为构建小型到中型 Web 应用的理想选择。本文将带你从零搭建一个简单的 Flask 项目,实现用户管理的 REST API,适合初学者快速上手,同时为有经验的开发者提供进阶建议和优化思路。
Flask 是一个微框架,核心功能精简,但通过扩展(如 Flask-RESTful)可实现复杂功能。本文基于 Flask 2.x,使用 Python 3.10+ 和 SQLite 数据库,通过 Flask-RESTful 实现 API。让我们开始吧!
前置准备
在开始之前,确保开发环境已就绪:
- Python:推荐 Python 3.10 或更高(Flask 2.x 支持 3.8+)。
- 包管理器:pip(默认)或 Poetry,用于安装依赖。
- IDE:PyCharm、VS Code 或其他支持 Python 的编辑器。
- 数据库:默认使用 SQLite(无需额外安装),生产环境可切换到 PostgreSQL。
- 项目结构:创建一个 Flask 项目,目录如下:
flask-demo ├── app.py ├── models.py ├── requirements.txt └── instance└── app.db // SQLite 数据库
安装 Python 和 Flask:
- 确保 Python 已安装:
python3 --version
。 - 创建虚拟环境:
python3 -m venv venv && source venv/bin/activate
(Linux/Mac)或venv\Scripts\activate
(Windows)。 - 安装 Flask 和相关扩展:
pip install flask==2.3.3 flask-restful==0.3.10 flask-sqlalchemy==3.1.1
步骤 1: 创建 Flask 项目
初始化项目并创建一个简单的 Flask 应用。
在 flask-demo/app.py
中编写核心代码:
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///instance/app.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Falsedb = SQLAlchemy(app)
api = Api(app)if __name__ == '__main__':app.run(debug=True)
说明:
Flask
:创建应用实例。SQLAlchemy
:用于数据库操作。Api
:Flask-RESTful 提供 REST API 支持。debug=True
:开发模式,自动重载。
步骤 2: 定义模型
在 flask-demo/models.py
中定义 User
模型:
from app import dbclass User(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(50), nullable=False)age = db.Column(db.Integer, nullable=False)def __str__(self):return f'<User {self.name}>'
初始化数据库:
在项目根目录运行 Python 解释器:
from app import app, db
with app.app_context():db.create_all()
说明:
db.Model
:定义数据库模型。db.create_all()
:创建 SQLite 数据库和表(instance/app.db
)。
步骤 3: 创建 REST API
在 app.py
中添加 API 资源:
from flask import Flask
from flask_restful import Api, Resource, reqparse, abort
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///instance/app.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Falsedb = SQLAlchemy(app)
api = Api(app)# 导入模型
from models import User# 请求解析器
user_parser = reqparse.RequestParser()
user_parser.add_argument('name', type=str, required=True, help='Name is required')
user_parser.add_argument('age', type=int, required=True, help='Age is required')# 用户资源
class UserResource(Resource):def get(self, user_id):user = User.query.get(user_id)if not user:abort(404, message=f"User {user_id} not found")return {'id': user.id, 'name': user.name, 'age': user.age}def put(self, user_id):args = user_parser.parse_args()user = User.query.get(user_id)if not user:abort(404, message=f"User {user_id} not found")user.name = args['name']user.age = args['age']db.session.commit()return {'id': user.id, 'name': user.name, 'age': user.age}, 200def delete(self, user_id):user = User.query.get(user_id)if not user:abort(404, message=f"User {user_id} not found")db.session.delete(user)db.session.commit()return '', 204class UserListResource(Resource):def get(self):users = User.query.all()return [{'id': user.id, 'name': user.name, 'age': user.age} for user in users]def post(self):args = user_parser.parse_args()user = User(name=args['name'], age=args['age'])db.session.add(user)db.session.commit()return {'id': user.id, 'name': user.name, 'age': user.age}, 201# 添加路由
api.add_resource(UserListResource, '/api/users')
api.add_resource(UserResource, '/api/users/<int:user_id>')if __name__ == '__main__':app.run(debug=True)
说明:
RequestParser
:验证和解析请求参数。UserResource
:处理单用户操作(GET/PUT/DELETE)。UserListResource
:处理用户列表(GET/POST)。
步骤 4: 运行和测试
-
启动服务器:
python app.py
-
测试 API:
- GET
http://localhost:5000/api/users
:列出所有用户。 - POST
http://localhost:5000/api/users
:{"name": "Alice","age": 25 }
- GET
http://localhost:5000/api/users/1
:获取 ID 为 1 的用户。 - PUT
http://localhost:5000/api/users/1
:{"name": "Bob","age": 30 }
- DELETE
http://localhost:5000/api/users/1
:删除用户。
- GET
-
调试技巧:
- 错误日志:查看终端输出(
debug=True
)。 - 数据库问题:检查
instance/app.db
或 SQLAlchemy 配置。 - API 测试:使用 Postman、curl 或 VS Code 的 REST Client。
- 错误日志:查看终端输出(
步骤 5: 依赖管理
创建 requirements.txt
:
pip freeze > requirements.txt
内容示例:
Flask==2.3.3
Flask-RESTful==0.3.10
Flask-SQLAlchemy==3.1.1
安装依赖:
pip install -r requirements.txt
进阶与最佳实践
-
生产配置:
- 使用 WSGI 服务器(如 Gunicorn):
pip install gunicorn gunicorn -w 4 -b 0.0.0.0:5000 app:app
- 配置环境变量:
app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL', 'sqlite:///instance/app.db')
- 使用 WSGI 服务器(如 Gunicorn):
-
数据库迁移:使用 Flask-Migrate:
pip install flask-migrate
初始化:
from flask_migrate import Migrate migrate = Migrate(app, db)
命令:
flask db init flask db migrate flask db upgrade
-
认证和权限:
- 集成 Flask-JWT-Extended 或 Flask-Login:
pip install flask-jwt-extended
- 集成 Flask-JWT-Extended 或 Flask-Login:
-
性能优化:
- 缓存:集成 Flask-Caching(支持 Redis/Memcached)。
- 分页:为列表 API 添加分页逻辑。
- 日志:配置 Python 的
logging
模块。
-
容器化:
创建Dockerfile
:FROM python:3.10-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:5000", "app:app"]
-
资源推荐:Flask 官网(flask.palletsprojects.com)、《Flask Web Development》。多实践 REST API 和认证系统。
总结
通过这个 Flask 示例,你学会了创建项目、定义模型、构建 REST API 和使用 SQLite 数据库。Flask 的轻量设计和灵活扩展使其适合快速开发和小型项目。