Я думаю, что вы правы в том, что порядок не гарантируется, но зависит от порядка, предоставленного сервером 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