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 和相关扩展:

    bash 复制代码
    pip install flask==2.3.3 flask-restful==0.3.10 flask-sqlalchemy==3.1.1

步骤 1: 创建 Flask 项目

初始化项目并创建一个简单的 Flask 应用。

flask-demo/app.py 中编写核心代码:

python 复制代码
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///instance/app.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = 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 模型:

python 复制代码
from app import db

class 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 解释器:

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 资源:

python 复制代码
from flask import Flask
from flask_restful import Api, Resource, reqparse, abort
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///instance/app.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = 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}, 200

    def 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 '', 204

class 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: 运行和测试

  1. 启动服务器

    bash 复制代码
    python app.py
  2. 测试 API

    • GET http://localhost:5000/api/users:列出所有用户。

    • POST http://localhost:5000/api/users

      json 复制代码
      {
          "name": "Alice",
          "age": 25
      }
    • GET http://localhost:5000/api/users/1:获取 ID 为 1 的用户。

    • PUT http://localhost:5000/api/users/1

      json 复制代码
      {
          "name": "Bob",
          "age": 30
      }
    • DELETE http://localhost:5000/api/users/1:删除用户。

  3. 调试技巧

    • 错误日志:查看终端输出(debug=True)。
    • 数据库问题:检查 instance/app.db 或 SQLAlchemy 配置。
    • API 测试:使用 Postman、curl 或 VS Code 的 REST Client。

步骤 5: 依赖管理

创建 requirements.txt

bash 复制代码
pip freeze > requirements.txt

内容示例:

复制代码
Flask==2.3.3
Flask-RESTful==0.3.10
Flask-SQLAlchemy==3.1.1

安装依赖

bash 复制代码
pip install -r requirements.txt

进阶与最佳实践

  • 生产配置

    • 使用 WSGI 服务器(如 Gunicorn):

      bash 复制代码
      pip install gunicorn
      gunicorn -w 4 -b 0.0.0.0:5000 app:app
    • 配置环境变量:

      python 复制代码
      app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL', 'sqlite:///instance/app.db')
  • 数据库迁移:使用 Flask-Migrate:

    bash 复制代码
    pip install flask-migrate

    初始化:

    python 复制代码
    from flask_migrate import Migrate
    migrate = Migrate(app, db)

    命令:

    bash 复制代码
    flask db init
    flask db migrate
    flask db upgrade
  • 认证和权限

    • 集成 Flask-JWT-Extended 或 Flask-Login:

      bash 复制代码
      pip install flask-jwt-extended
  • 性能优化

    • 缓存:集成 Flask-Caching(支持 Redis/Memcached)。
    • 分页:为列表 API 添加分页逻辑。
    • 日志:配置 Python 的 logging 模块。
  • 容器化

    创建 Dockerfile

    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 的轻量设计和灵活扩展使其适合快速开发和小型项目。

相关推荐
二哈喇子!3 小时前
BOM模型
开发语言·前端·javascript·bom
二哈喇子!3 小时前
Vue2 监听器 watcher
前端·javascript·vue.js
二哈喇子!3 小时前
空指针异常
开发语言
咚为3 小时前
Rust Print 终极指南:从底层原理到全场景实战
开发语言·后端·rust
jaray3 小时前
PyCharm 2024.3.2 Professional 如何更换 PyPI 镜像源
ide·python·pycharm·pypi 镜像源
%xiao Q3 小时前
GESP C++五级-202406
android·开发语言·c++
Psycho_MrZhang3 小时前
Neo4j Python SDK手册
开发语言·python·neo4j
yanyu-yaya4 小时前
前端面试题
前端·面试·前端框架
Traced back4 小时前
# C# + SQL Server 实现自动清理功能的完整方案:按数量与按日期双模式
开发语言·c#
sin22014 小时前
MyBatis的执行流程
java·开发语言·mybatis