你是否想过用Python创建一个网站或API,却被复杂的配置和概念吓退? 选择一个合适的框架是成功的第一步。Python生态中有三位明星选手:稳重的Django、灵活的Flask和现代的FastAPI。本文将带你了解它们,并用最直接的方式,在10分钟内搭建你的第一个Web接口。

第一部分:框架全景图——如何选择你的“第一把武器”?

选择框架就像选择汽车:Django是配置齐全的SUV,Flask是易于改装的家用轿车,而FastAPI则是动力强劲的超跑。没有绝对的好坏,只有是否适合你的场景。

1. Django: “大而全”的专家,为完美主义者而生

  • 核心理念:“自带电池”。它提供了一站式的解决方案,你需要的绝大部分功能(用户认证、管理后台、数据库ORM、表单处理等)都已内置。
  • 适合场景
    • 传统的、功能复杂的网站(如新闻门户、电子商务平台)。
    • 需要快速构建强大后台管理系统的项目。
    • 团队开发,需要统一的规范和强大的文档支持。
  • 特点
    • 优点:功能完善、开箱即用、安全性高、社区庞大、文档极为详尽。
    • 缺点:学习曲线相对陡峭、灵活性较低、有较强的项目结构约束。

2. Flask: “微内核”的艺术家,为极简主义和灵活性而生

  • 核心理念:“微核心+扩展”。Flask本身只包含最核心的路由和模板功能,其他功能(如数据库ORM、表单验证)都由丰富的扩展库提供。
  • 适合场景
    • 小型项目、微服务、快速原型验证。
    • API开发,特别是RESTful API。
    • 学习者,希望从底层理解Web工作原理。
  • 特点
    • 优点:极其灵活、学习曲线平缓、代码直观、可自由搭配技术栈。
    • 缺点:很多功能需要自己选择和组织扩展,对架构能力有一定要求。

3. FastAPI: 现代的挑战者,为高性能API而生

  • 核心理念:基于Python类型提示,提供极高的开发效率和运行时性能。它自动生成交互式API文档,是其最大亮点。
  • 适合场景
    • 构建高性能的RESTful API(尤其是前后端分离项目)。
    • 需要自动生成API文档的项目。
    • 对性能有较高要求的现代应用。
  • 特点
    • 优点:性能极高(媲美Node.js和Go)、开发速度快、自动生成文档、代码直观易懂(得益于类型提示)。
    • 缺点:相对较新(但发展极快),某些领域的生态系统不如Django/Flask成熟。

快速选择指南:

  • 新手入门,想快速看到效果? → Flask 或 FastAPI
  • 要做一个功能完整的正规商业网站? → Django
  • 主要做后端API,特别是微服务? → FastAPI 或 Flask
  • 想深入学习Web开发原理? → Flask

第二部分:实战演示——用 Flask 和 FastAPI 构建你的第一个RESTful API

理论说再多,不如亲手写一行代码。下面我们将分别用Flask和FastAPI构建一个简单的“待办事项”API,支持查看和添加任务。

环境准备
首先,安装必要的库:

# 安装 Flask
pip install flask

# 安装 FastAPI 和 用于服务器的 Uvicorn
pip install fastapi uvicorn
实战一:用 Flask 搭建简易待办API
  1. 创建文件 flask_app.py
from flask import Flask, jsonify, request

# 1. 创建 Flask 应用实例
app = Flask(__name__)

# 用一个内存中的列表来模拟数据库
todos = [
    {"id": 1, "task": "学习 Python", "completed": False},
    {"id": 2, "task": "写一个 Flask API", "completed": True}
]

# 2. 定义路由和视图函数

# GET /api/todos: 获取所有待办事项
@app.route('/api/todos', methods=['GET'])
def get_all_todos():
    # jsonify 将Python列表/字典转换为JSON格式返回
    return jsonify(todos)

# GET /api/todos/<id>: 获取单个待办事项
@app.route('/api/todos/<int:todo_id>', methods=['GET'])
def get_todo(todo_id):
    # 在列表中查找对应ID的待办项
    todo = next((item for item in todos if item['id'] == todo_id), None)
    if todo is None:
        # 如果没找到,返回404错误
        return jsonify({"error": "Todo not found"}), 404
    return jsonify(todo)

# POST /api/todos: 创建一个新的待办事项
@app.route('/api/todos', methods=['POST'])
def create_todo():
    # 从请求的JSON体中获取数据
    data = request.get_json()

    # 简单的数据验证
    if not data or 'task' not in data:
        return jsonify({"error": "Task is required!"}), 400

    # 创建新的待办项
    new_id = max(item['id'] for item in todos) + 1 if todos else 1
    new_todo = {
        "id": new_id,
        "task": data['task'],
        "completed": data.get('completed', False) # 如果没有提供completed,默认为False
    }
    todos.append(new_todo)

    # 返回新创建的项目和状态码201 (Created)
    return jsonify(new_todo), 201

# 3. 运行应用
if __name__ == '__main__':
    app.run(debug=True) # debug=True 表示开启调试模式,代码修改后自动重启
  1. 运行并测试
    在终端执行:

    python flask_app.py
    

    你会看到输出提示服务运行在 http://127.0.0.1:5000

  2. 使用工具测试API(推荐使用 Postman 或 curl)

    • 获取所有待办:浏览器访问 http://127.0.0.1:5000/api/todos
    • 创建新待办:使用Postman,向 http://127.0.0.1:5000/api/todos 发送一个POST请求,Body选择raw / JSON,内容为:{"task": "测试新任务"}
实战二:用 FastAPI 搭建同款待办API
  1. 创建文件 fastapi_app.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel # 用于数据验证和序列化的库,FastAPI自带
from typing import Optional

# 1. 创建 FastAPI 应用实例
app = FastAPI(title="Simple Todo API", description="A simple demo API")

# 同样模拟一个内存数据库
todos = [
    {"id": 1, "task": "学习 Python", "completed": False},
    {"id": 2, "task": "写一个 FastAPI", "completed": True}
]

# 2. 使用 Pydantic 模型定义数据格式
class TodoItem(BaseModel):
    task: str
    completed: Optional[bool] = False # 可选字段,默认为False

class TodoItemResponse(TodoItem):
    id: int # 响应模型包含ID

# 3. 定义路径操作

# GET /api/todos
@app.get("/api/todos", response_model=list[TodoItemResponse])
async def get_all_todos():
    return todos

# GET /api/todos/{todo_id}
@app.get("/api/todos/{todo_id}", response_model=TodoItemResponse)
async def get_todo(todo_id: int): # 参数类型提示,FastAPI会自动转换和验证
    todo = next((item for item in todos if item['id'] == todo_id), None)
    if todo is None:
        raise HTTPException(status_code=404, detail="Todo not found")
    return todo

# POST /api/todos
@app.post("/api/todos", response_model=TodoItemResponse, status_code=201)
async def create_todo(item: TodoItem): # 参数直接使用Pydantic模型,自动验证请求体
    new_id = max(item['id'] for item in todos) + 1 if todos else 1
    new_todo = {"id": new_id, **item.dict()} # 解包模型数据
    todos.append(new_todo)
    return new_todo
  1. 运行并测试
    在终端执行:

    uvicorn fastapi_app:app --reload
    

    --reload 表示代码修改后自动重启。

  2. 测试API并查看自动文档!

    • 服务运行在 http://127.0.0.1:8000
    • 自动生成的交互式文档:访问 http://127.0.0.1:8000/docs (Swagger UI)或 http://127.0.0.1:8000/redoc。你可以直接在这个页面上测试API接口,这是FastAPI最大的魅力之一!
总结与下一步

恭喜!你已经用两种不同的框架成功创建了功能相同的Web API。回顾一下:

  • Flask的代码非常直观,接近底层HTTP操作,适合理解基本原理。
  • FastAPI的代码利用了现代Python特性(类型提示),更加严谨,并自动生成了强大的API文档。

你的下一步:

  1. 添加更多功能:尝试为API添加PUT(更新)和DELETE(删除)操作。
  2. 连接真实数据库:将内存列表替换成SQLite(使用sqlite3库)、PostgreSQL(使用psycopg2或SQLAlchemy ORM)。
  3. 添加用户认证:学习如何使用JWT(JSON Web Tokens)来保护你的API。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐