Короткий ответ
Ошибка в том, что request.get_json() при отсутствующем или некорректном JSON-теле по умолчанию может вернуть None (или выбросить исключение при force/неверном Content-Type), а код сразу обращается к data['name'] без проверки, вызывая TypeError/500.
Как это работает подробнее
request.get_json(silent=True) возвращает None вместо исключения, если тело не является валидным JSON или заголовок Content-Type не application/json. Без проверки на None следующее обращение data['name'] вызовет TypeError: 'NoneType' object is not subscriptable, что Flask превратит в ответ 500 Internal Server Error.
Пример кода
example.py
# Код с ошибкой:
@app.route("/users", methods=["POST"])
def create_user():
data = request.get_json() # может вернуть None
name = data["name"] # TypeError, если data is None -> 500
return {"name": name}, 201
# Исправление:
@app.route("/users", methods=["POST"])
def create_user_fixed():
data = request.get_json(silent=True)
if not data or "name" not in data:
return {"error": "name is required"}, 400
return {"name": data["name"]}, 201Что использовать на практике
- Практика. Правильный подход — явно проверять
data is None(или использоватьsilent=False, который сам кидает400при ошибке парсинга, в зависимости от версии) и возвращать400 Bad Requestс понятным сообщением, а не пропускать проверку.
Подводные камни
- Риск. Считают, что отсутствие тела запроса — это «исключительная ситуация уровня сервера», тогда как это стандартная ошибка клиента (
400), а не сервера (500); не пишут тест на кейс «тело запроса отсутствует/невалидно».