В моем приложении Werkzeug я перехватывающий все ошибочные ответы и пытаюсь ответить с ответом JSON, если клиент ожидает JSON или вернуть обычную HTML-страницу с 404 или 500:Как определить, является ли клиент ожидает ответ JSON
def handle_error_response(self, environ, start_response, exc):
if ('application/json' in environ.get('CONTENT_TYPE', '')
and exc.get_response().content_type != 'application/json'):
start_response('%s %s' % (exc.code, exc.name),
(('Content-Type', 'application/json'),))
return (json.dumps({"success": False, "error": exc.description}, ensure_ascii=False),)
# go the regular path
...
В этом решении я полагаюсь на заголовок Content-Type
, содержащий строку 'application/json'
.
Однако это не выглядит как правильное решение, потому что Википедия говорит:
Content-Type мим тип тела запроса (используется с POST и PUT запросов)
Хорошая стратегия проверить, находится ли 'text/html'
внутри заголовка Accept
, а затем возвратить ответ HTML в противном случае вернуть ответ JSON?
Любые другие более надежные решения?
Когда Chrome запрашивает HTML заголовок страницы
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
отправляется, когда угасающий делает запрос API
Accept: application/json, text/javascript, */*; q=0.01
отправляется.
Может быть, необходимо принять во внимание X-Requested-With: XMLHttpRequest
?
Спасибо за подсказку о 'AcceptMixin', но мой вопрос заключается в том, как использовать информацию' AcceptMixin.accept_mimetypes'. Когда Chrome запрашивает HTML-страницу «HTTP_ACCEPT»: «text/html, application/xhtml + xml, application/xml; q = 0.9, image/webp, */*; q = 0.8'' отправляется, когда Ember делает API request ''HTTP_ACCEPT': 'application/json, text/javascript, */*; q = 0.01''. И в обоих случаях 'request.accept_mimetypes.accept_json' ==' request.accept_mimetypes.accept_html' == 'True'. – warvariuc