Короткий ответ
Без защиты от дублирования повторный POST с одинаковыми данными создаст второй заказ в БД, так как POST по умолчанию не идемпотентен — сервер просто выполнит вставку ещё раз.
Как это работает подробнее
Каждый POST-запрос интерпретируется сервером как новая команда «создать», независимо от того, что предыдущий запрос уже создал такой же заказ.
Пример кода
example.py
@app.post("/orders")
def create_order(data: OrderIn):
order = Order(**data.dict())
db.add(order)
db.commit()
return orderЧто использовать на практике
- Практика. Повтор может произойти из-за сетевого сбоя, ретраев на уровне клиента/балансировщика или двойного клика пользователя; без защиты появляются дублирующиеся заказы и двойное списание денег.
Подводные камни
- Риск. Считать эту проблему редкой и игнорировать её при проектировании; решать проблему только на фронтенде (блокировка кнопки), что не защищает от сетевых ретраев.