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 如果你正在构建需要可扩展的现代应用,或是你热衷于自动数据验证和即时、交互式文档。
0 浏览
Back to Blog

相关文章

阅读更多 »

不糟糕的语义失效

缓存问题 如果你在 Web 应用上工作了一段时间,你就会了解缓存的情况。你加入缓存,一切都变快了,然后有人……