Получение заголовков запросов в том же порядке, в котором они получены во Flask - PullRequest
1 голос
/ 18 апреля 2019

Есть ли какой-нибудь способ в приложении на основе Flask получить заголовки запроса в том же порядке, в котором они получены (то есть, как, например, nc показывал бы их)?

В настоящее время я использую request.headers.keys() (будучи request объектом входящего запроса), но это не гарантирует порядок.

Я знаю, что порядок или заголовки не имеют значения в HTTP, но мне интересно, может ли это бытьсделано в любом случае.Например, для реализации средства ведения журнала для приложений HTTP, которое печатает точный запрос, который он получает (аналогично nc).

1 Ответ

2 голосов
/ 18 апреля 2019

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

Если вы можете проверить и исправить версию Python на 3.7+ и версию используемого сервера WSGI, это может быть достаточно хорошо, но не обязательно переносимо на все серверы или будущие версии серверов.

Например, используя здесь Flask 1.0.2 и Python 3.7.1, где dict поддерживает порядок вставки в качестве официальной части спецификации языка, а Flask вставляет заголовки в request.headers в порядке их найденный в среде, это можно показать, сравнив необработанные заголовки запросов / ответов браузера с выходными данными следующего приложения Flask, что заголовки поддерживают соответствие порядка 1: 1 как с внутренним сервером Flask, так и с gunicorn 19.5.0.

Примечание: форма предназначена только для упрощения тестирования get и post, чтобы увидеть, обрабатываются ли типы содержимого и длина содержимого по-разному во время POST.

from flask import Flask, request
app = Flask(__name__)


@app.route("/", methods=["GET", "POST"])
def index():
    return "<br>".join(list(map(lambda i: f"{i[0]}: {i[1]}", request.headers.items()))) + """
    <p><form method="POST"><input type="submit" name="submit" value="Submit"></form></p>"""


if __name__ == "__main__":
    app.run()

Выход:

Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://127.0.0.1:8000/
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...