Flask 项目示例

本章通过一个简单的任务管理 API,演示 Flask 项目的基本目录结构、路由组织和数据处理方式。

项目结构

todo-api/
  app/
    __init__.py
    routes.py
    services.py
  tests/
    test_tasks.py
  config.py
  run.py

创建应用

app/__init__.py 负责创建 Flask 实例并注册路由。

from flask import Flask

def create_app():
    app = Flask(__name__)

    from .routes import bp
    app.register_blueprint(bp)

    return app

定义路由

app/routes.py 提供任务列表、创建任务和完成任务三个接口。

from flask import Blueprint, jsonify, request
from .services import create_task, finish_task, list_tasks

bp = Blueprint("tasks", __name__, url_prefix="/tasks")

@bp.get("/")
def get_tasks():
    return jsonify(list_tasks())

@bp.post("/")
def add_task():
    payload = request.get_json() or {}
    title = payload.get("title", "").strip()

    if not title:
        return {"message": "title is required"}, 400

    return jsonify(create_task(title)), 201

@bp.patch("/<int:task_id>/finish")
def complete_task(task_id):
    task = finish_task(task_id)
    if task is None:
        return {"message": "task not found"}, 404
    return jsonify(task)

编写业务逻辑

示例使用内存列表保存数据,真实项目可以替换为数据库模型。

tasks = []
next_id = 1

def list_tasks():
    return tasks

def create_task(title):
    global next_id
    task = {"id": next_id, "title": title, "done": False}
    next_id += 1
    tasks.append(task)
    return task

def finish_task(task_id):
    for task in tasks:
        if task["id"] == task_id:
            task["done"] = True
            return task
    return None

启动项目

from app import create_app

app = create_app()

if __name__ == "__main__":
    app.run(debug=True)

运行:

python run.py

测试接口

curl http://127.0.0.1:5000/tasks/

curl -X POST http://127.0.0.1:5000/tasks/ \
  -H "Content-Type: application/json" \
  -d "{\"title\":\"Learn Flask\"}"

扩展方向

  • 使用 SQLAlchemy 保存任务
  • 增加用户登录和任务归属
  • 增加分页、搜索和排序
  • 使用 pytest 编写接口测试
  • 使用 Docker 部署服务

小结

这个示例展示了 Flask API 项目的基本骨架:应用工厂创建应用,蓝图组织路由,服务层处理业务逻辑。掌握这个结构后,可以逐步加入数据库、认证和部署能力。