幂等性是Python Web服务保障数据一致性和操作可靠性的基础原则,要求同一请求执行多次结果完全相同,需通过唯一业务ID、数据库约束、状态机或Token等机制实现,并规避校验不全、缓存无TTL、并发竞争等常见陷阱。
幂等性在 Python Web 服务中不是“可选优化”,而是保障数据一致性和用户操作可靠性的基础设计原则。简单说:同一个请求执行一次或重复多次,结果必须完全相同——服务器状态不因重试而改变,数据库不被意外创建多条记录、扣款不止一次、订单不重复提交。
HTTP 协议本身不保证请求只到达一次。网络超时、客户端崩溃、用户手抖连点、浏览器刷新、代理重发……都可能让同一个逻辑操作(比如“支付100元”)被后端收到多次。如果接

没有银弹,选择取决于业务场景和系统约束。以下几种在 Python Web(Flask/FastAPI/Django)中落地简单、效果明确:
写得看似幂等,实际仍可能出错:
简化版核心逻辑,生产中需补全异常处理、日志、Redis 连接池等:
@app.post("/orders")
def create_order(
payload: OrderPayload,
idempotency_key: str = Header(..., alias="Idempotency-Key")
):
# 1. 查缓存是否已有成功结果
cached = redis.get(f"idemp:{idempotency_key}")
if cached:
return json.loads(cached)
# 2. 原子性写入幂等标识(防止并发)
if not redis.set(f"idemp:{idempotency_key}:lock", "1", nx=True, ex=10):
raise HTTPException(409, "Processing")
try:
# 3. 执行真实业务(含 DB 事务)
with db.begin():
order = Order(**payload.dict())
db.add(order)
db.flush() # 获取自增 ID
result = {"order_id": order.id, "status": "created"}
# 4. 写入成功结果(带过期,比如 24h)
redis.setex(f"idemp:{idempotency_key}", 86400, json.dumps(result))
return result
except Exception:
# 失败也要清理锁,避免死锁
redis.delete(f"idemp:{idempotency_key}:lock")
raise