Отключение колбы () с пользовательским http-кодом
Я использую фреймворк Flask в своем проекте с чистым JSON API. Он отображает только ответы JSON без HTML или статических файлов.
Я пытаюсь добиться функции abort() с помощью пользовательского http-кода, в моем случае 204 (без содержимого), который не определен по умолчанию. У меня в настоящее время код как:
# Error define
class NoContent(HTTPException):
code = 204
description = ('No Content')
abort.mapping[204] = NoContent
def make_json_error(ex):
response = jsonify(error=str(ex))
response.status_code = (ex.code
if isinstance(ex, HTTPException)
else 500)
return response
custom_exceptions = {}
custom_exceptions[NoContent.code] = NoContent
for code in custom_exceptions.iterkeys():
app.error_handler_spec[None][code] = make_json_error
# Route
@app.route("/results/<name>")
def results(name=None):
return jsonify(data=results) if results else abort(204)
Это работает хорошо, я получаю ответ как:
127.0.0.1 - - [02/Dec/2014 10:51:09] "GET /results/test HTTP/1.1" 204 -
Но без какого-либо содержания. Он ничего не отображает, даже пустую белую страницу в браузере.
Я могу использовать errorhandler
@app.errorhandler(204)
def error204(e):
response = jsonify(data=[])
return response
Но он возвращает HTTP-код 200. В нужде 204 здесь. Когда я добавляю в error204() строку вроде:
response.status_code = 204
Это ничего не делает еще раз.
Я застрял, и я понятия не имею, где есть ошибка с этим подходом. Пожалуйста помоги.
Если мой подход неверен с точки зрения дизайна, предложите что-то еще.
Заранее спасибо.
2 ответа
Помните, HTTP 204 - это "Нет контента". RFC 7231 (и RFC 2616 до него) требует, чтобы пользовательские агенты игнорировали все после последней строки заголовка:
Код состояния 204 (без содержимого) указывает, что сервер успешно выполнил запрос и что в теле полезной нагрузки ответа нет дополнительного содержимого для отправки... Ответ 204 заканчивается первой пустой строкой после полей заголовка, поскольку он не может содержать тело сообщения.
~ RFC 7231 (акцент мой)
Ответ 204 НЕ ДОЛЖЕН включать тело сообщения и, таким образом, всегда заканчивается первой пустой строкой после полей заголовка.
~ RFC 2616
Вам необходимо вернуть код состояния в обработчике ошибок.
@app.errorhandler(204)
def error204(e):
response = jsonify(data=[])
return response, 204
Если оставить код состояния, Flask интерпретирует его как 200.