Python 示例 HTTP CRUD 与 FastAPI 和 Flask
发布: (2026年3月4日 GMT+8 07:04)
3 分钟阅读
原文: Dev.to
Source: Dev.to
介绍
在 Python Web 开发的世界里,CRUD(创建、读取、更新、删除)几乎是每个应用的根基。对于初学者来说,首个障碍不是逻辑,而是工具选择。你是选择 Flask,这个可靠的“微框架”,已成为业界十多年之久的主流?还是选择 FastAPI,这个高性能的新秀,正席卷开发者社区?
最大的区别往往在于它们的运行方式。FastAPI 需要像 uvicorn 这样的外部服务器来处理其异步特性,而 Flask 自带内置服务器,便于快速本地开发。
FastAPI 示例 (fastapi_server.py)
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Dict
app = FastAPI()
# Data Schema
class User(BaseModel):
name: str
email: str
# In-memory "Database"
db: Dict[int, User] = {}
@app.post("/users/{user_id}")
def create_user(user_id: int, user: User):
if user_id in db:
raise HTTPException(status_code=400, detail="User already exists")
db[user_id] = user
return {"status": "Created", "data": user}
@app.get("/users/{user_id}")
def read_user(user_id: int):
if user_id not in db:
raise HTTPException(status_code=404, detail="User not found")
return db[user_id]
@app.put("/users/{user_id}")
def update_user(user_id: int, user: User):
if user_id not in db:
raise HTTPException(status_code=404, detail="User not found")
db[user_id] = user
return {"status": "Updated", "data": user}
@app.delete("/users/{user_id}")
def delete_user(user_id: int):
if user_id not in db:
raise HTTPException(status_code=404, detail="User not found")
del db[user_id]
return {"status": "Deleted"}
# To run: uvicorn fastapi_server:app --reload
测试 FastAPI (test_fastapi.py)
import requests
BASE = "http://127.0.0.1:8000/users"
# POST
print("POST:", requests.post(f"{BASE}/1", json={"name": "Alice", "email": "alice@web.com"}).json())
# GET
print("GET:", requests.get(f"{BASE}/1").json())
# PUT
print("PUT:", requests.put(f"{BASE}/1", json={"name": "Alice Smith", "email": "alice@web.com"}).json())
# DELETE
print("DELETE:", requests.delete(f"{BASE}/1").json())
Flask 示例 (flask_server.py)
from flask import Flask, request, jsonify
app = Flask(__name__)
# In-memory "Database"
db = {}
@app.route('/users/', methods=['POST'])
def create_user(user_id):
if user_id in db:
return jsonify({"error": "Exists"}), 400
db[user_id] = request.json
return jsonify({"status": "Created", "data": db[user_id]}), 201
@app.route('/users/', methods=['GET'])
def read_user(user_id):
user = db.get(user_id)
return jsonify(user) if user else (jsonify({"error": "Not found"}), 404)
@app.route('/users/', methods=['PUT'])
def update_user(user_id):
if user_id not in db:
return jsonify({"error": "Not found"}), 404
db[user_id] = request.json
return jsonify({"status": "Updated", "data": db[user_id]})
@app.route('/users/', methods=['DELETE'])
def delete_user(user_id):
if user_id in db:
del db[user_id]
return jsonify({"status": "Deleted"})
return jsonify({"error": "Not found"}), 404
if __name__ == '__main__':
# Built-in server (No uvicorn needed)
app.run(port=5000, debug=True)
测试 Flask (test_flask.py)
import requests
BASE = "http://127.0.0.1:5000/users"
# POST
print("POST:", requests.post(f"{BASE}/1", json={"name": "Bob", "email": "bob@web.com"}).json())
# GET
print("GET:", requests.get(f"{BASE}/1").json())
# PUT
print("PUT:", requests.put(f"{BASE}/1", json={"name": "Bob Jones", "email": "bob@web.com"}).json())
# DELETE
print("DELETE:", requests.delete(f"{BASE}/1").json())
你应该选择哪一个?
既然你已经看到了两者的实际效果,选择取决于你的项目目标:
- 选择 Flask 如果你想要一个简单、轻量的设置,能够对每一行代码拥有完全控制,并且希望通过单个
python app.py命令运行你的应用。 - 选择 FastAPI 如果你正在构建需要可扩展的现代应用,或是你热衷于自动数据验证和即时、交互式文档。