Отключение колбы () с пользовательским 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 7231RFC 2616 до него) требует, чтобы пользовательские агенты игнорировали все после последней строки заголовка:

Код состояния 204 (без содержимого) указывает, что сервер успешно выполнил запрос и что в теле полезной нагрузки ответа нет дополнительного содержимого для отправки... Ответ 204 заканчивается первой пустой строкой после полей заголовка, поскольку он не может содержать тело сообщения.

~ RFC 7231 (акцент мой)

Ответ 204 НЕ ДОЛЖЕН включать тело сообщения и, таким образом, всегда заканчивается первой пустой строкой после полей заголовка.

~ RFC 2616

Вам необходимо вернуть код состояния в обработчике ошибок.

@app.errorhandler(204)
def error204(e):
    response = jsonify(data=[])
    return response, 204

Если оставить код состояния, Flask интерпретирует его как 200.

Другие вопросы по тегам