Короткий ответ
Нужно явно проверить обязательные поля перед использованием данных и вернуть 400 Bad Request с понятным сообщением, либо использовать библиотеку валидации (например, marshmallow/pydantic) и перехватывать её ошибку.
Как это работает подробнее
Flask сам не валидирует входные данные — это задача разработчика или сторонней библиотеки. Без проверки обращение к отсутствующему ключу словаря (data['field']) вызывает KeyError, который без обработки превращается в 500 Internal Server Error, хотя по сути это ошибка клиента.
Пример кода
example.py
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/users", methods=["POST"])
def create_user():
data = request.get_json(silent=True) or {}
missing = [f for f in ("name", "email") if f not in data]
if missing:
return jsonify({"error": f"missing fields: {missing}"}), 400
return jsonify({"name": data["name"], "email": data["email"]}), 201
# POST {"name": "Bob"} -> 400 {"error": "missing fields: ['email']"}Что использовать на практике
- Практика. Базовый вариант — ручная проверка
if 'field' not in data: return {'error': ...}, 400. Для более сложных схем применяют marshmallow/pydantic с перехватом исключения валидации и преобразованием его в400с деталями по полям.
Подводные камни
- Риск. Оставляют необработанные
KeyError/ValueErrorдолетать до стандартного обработчика ошибок Flask, который в production отдаёт общий500без подсказки клиенту, что он прислал; не пишут отдельный тест на запрос без обязательного поля.