用 Python 快速搭建你的第一个网站:Flask/Django/FastAPI 对比指南
·
你是否想过用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
- 创建文件
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 表示开启调试模式,代码修改后自动重启
-
运行并测试
在终端执行:python flask_app.py你会看到输出提示服务运行在
http://127.0.0.1:5000。 -
使用工具测试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
- 创建文件
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
-
运行并测试
在终端执行:uvicorn fastapi_app:app --reload--reload表示代码修改后自动重启。 -
测试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文档。
你的下一步:
- 添加更多功能:尝试为API添加
PUT(更新)和DELETE(删除)操作。 - 连接真实数据库:将内存列表替换成SQLite(使用
sqlite3库)、PostgreSQL(使用psycopg2或SQLAlchemy ORM)。 - 添加用户认证:学习如何使用JWT(JSON Web Tokens)来保护你的API。
更多推荐



所有评论(0)