在基于Flask的应用程序中,有没有办法以获取请求报头的相同顺序来获取它们(例如,就像nc
所显示的那样)?
目前我正在使用request.headers.keys()
(作为传入请求对象的request
),但它不能保证顺序。
我知道顺序或标题在HTTP中并不重要,但我想知道是否可以这样做。例如,为HTTP应用程序实现一个记录器工具,打印它收到的确切请求(类似于nc
)。
发布于 2019-04-19 03:07:21
我认为你是正确的,因为排序不是有保证的,但取决于WSGI服务器在WSGI环境字典中提供的顺序,并且可能会根据所使用的服务器而有所不同。
如果您可以在3.7+上验证和修复python版本以及所使用的WSGI服务器的版本,这可能已经足够好了,但不一定可以在所有服务器或未来版本的服务器上移植。
例如,在这里使用Flask 1.0.2和Python3.7.1,其中dict's maintain insertion order作为语言规范的官方部分,Flask将头部插入到request.headers中,以便在环境中找到它们,可以通过将浏览器原始请求/响应头部与以下Flask应用程序的输出进行比较来显示,头部与内部Flask服务器和gunicorn 19.5.0保持1:1的排序匹配。
注意:表单只是用来测试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
https://stackoverflow.com/questions/55751419
复制相似问题