← Назад к вопросам
Какой HTTP статус код выводить при отсутствии данных в БД?
2.2 Middle🔥 171 комментариев
#Python Core#Архитектура и паттерны
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Выбор HTTP статус кода при отсутствии данных
При отсутствии данных в базе данных необходимо использовать 404 Not Found — это стандартный и правильный статус код для такой ситуации.
Почему именно 404?
Статус код 404 означает, что запрашиваемый ресурс не найден на сервере. Это применимо в следующих случаях:
- Пользователь запрашивает конкретный ресурс по ID:
GET /api/v1/users/123— если пользователя с ID 123 нет в БД, возвращаем 404 - Запрос данных по другим уникальным параметрам:
GET /api/v1/posts/slug-name— если поста с таким slug нет, это 404 - Любая операция с несуществующим ресурсом должна вернуть 404
Примеры реализации
from fastapi import FastAPI, HTTPException, status
app = FastAPI()
@app.get("/api/v1/users/{user_id}")
async def get_user(user_id: int):
user = await db.users.get(user_id)
if not user:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Пользователь не найден"
)
return user
Когда НЕ использовать 404
200 OK с пустым списком — если запрашиваем коллекцию (например, все посты пользователя):
@app.get("/api/v1/users/{user_id}/posts")
async def get_user_posts(user_id: int):
# Проверяем, что пользователь существует
user = await db.users.get(user_id)
if not user:
raise HTTPException(status_code=404, detail="Пользователь не найден")
# Если постов нет — это OK, возвращаем пустой список
posts = await db.posts.filter(user_id=user_id)
return posts # Может быть []
Другие статус коды в контексте данных
- 200 OK — данные найдены и успешно возвращены
- 204 No Content — операция выполнена, но нет контента для возврата (редко используется)
- 400 Bad Request — ошибка в параметрах запроса (неверный формат ID, невалидные фильтры)
- 401 Unauthorized — недостаточно прав доступа
- 403 Forbidden — доступ запрещён
- 404 Not Found — ресурс не существует в БД
- 500 Internal Server Error — ошибка на сервере при получении данных
Лучшие практики
Всегда проверяй наличие ресурса перед выполнением операций над ним:
@app.put("/api/v1/users/{user_id}")
async def update_user(user_id: int, data: UserUpdate):
user = await db.users.get(user_id)
if not user:
raise HTTPException(status_code=404, detail="Пользователь не найден")
updated = await db.users.update(user_id, data)
return updated
@app.delete("/api/v1/users/{user_id}")
async def delete_user(user_id: int):
user = await db.users.get(user_id)
if not user:
raise HTTPException(status_code=404, detail="Пользователь не найден")
await db.users.delete(user_id)
return {"status": "deleted"}
Консистентность — используй 404 для всех операций (GET, PUT, DELETE) на несуществующих ресурсах, но 200 с пустым списком для коллекций.