Flask/Eve + WSGI и HTTP_X_HTTP_METHOD_OVERRIDE

Я пытаюсь понять, как и когда заголовки HTTP среды WSGI переименовываются в объекте запроса приложения.

Я пробую Eve и отправляю POST или PUT с X-HTTP-Method-Override.

Код внутри Eve пытается получить доступ к заголовкам запроса, используя следующий код (здесь):

return request.headers.get('X-HTTP-Method-Override', request.method)

В моей среде WSGI у меня есть HTTP_X_HTTP_METHOD_OVERRIDE со значением PATCH.

Когда я пытаюсь сделать дамп request.headers, я получаю:

Request Header: ('X-Http-Method-Override', u'PATCH')
Request Header: ('Origin', u'http://localhost:9000')
Request Header: ('Content-Length', u'622')
Request Header: ('Host', u'localhost:24435')
Request Header: ('Accept', u'application/json;charset=UTF-8')
Request Header: ('Content-Type', u'application/json')
Request Header: ('Accept-Encoding', u'identity')

Я проверил онлайн, и другие приложения Python пытаются получить доступ к этому конкретному заголовку запроса в случае:

X-HTTP-Method-Override, а не X-Http-Method-Override (который я получаю в запросе)


person lucabelluccini    schedule 17.08.2015    source источник


Ответы (1)


Flask позаботится об извлечении заголовков из переменных среды WSGI за вас, в процессе удалив начальный префикс HTTP_. Префикс присутствует в среде WSGI для того, чтобы отличать заголовки от другой информации WSGI, но этот префикс становится полностью избыточным, если вы извлекаете заголовки в выделенную структуру.

Объект request также предоставляет вам специализированный словарь, в котором ключи сопоставляются без учета регистра. Неважно, какой регистр вы используете здесь, пока версия в нижнем регистре соответствует ключу заголовка в нижнем регистре; http, Http, HTTP и HtTp — допустимые варианты регистра. Это связано с тем, что в стандарте HTTP прямо указано, что регистр следует игнорировать при обработке заголовков.

См. Headers class reference в документации Werkzeug, это основы для объекта request.headers. В свою очередь, он совместим с классом wsgiref.headers.Headers, включая это:

Для каждого из этих методов ключом является имя заголовка (обрабатывается без учета регистра), а значением является первое значение, связанное с этим именем заголовка.

Акцент мой.

person Martijn Pieters    schedule 17.08.2015
comment
Другими словами, требованием спецификации WSGI является то, что серверы WSGI передают заголовки в стиле CGI как «HTTP_*». Некоторые фреймворки отменят это, чтобы можно было использовать исходные имена заголовков. - person Graham Dumpleton; 17.08.2015
comment
@GrahamDumpleton: точно, и они делают это, потому что среда WSGI содержит больше, чем заголовки, это префикс HTTP_, который группирует информацию. - person Martijn Pieters; 17.08.2015