在基于Flask的应用程序中,是否可以按照获取请求标头的顺序来获取请求标头(例如,例如nc
会显示请求标头)?
当前,我正在使用request.headers.keys()
(即request
传入请求对象),但不能保证顺序。
我知道HTTP中的顺序或标题无关紧要,但是我想知道是否可以这样做。例如,为HTTP应用程序实现一个记录器工具,该工具可打印接收到的确切请求(类似于nc
)。
答案 0 :(得分:2)
我认为您是正确的,因为不能保证顺序,但取决于WSGI环境中WSGI服务器提供的顺序,并且可能会因所使用的服务器而异。
如果您可以将python版本验证并修复为3.7+,并且使用的WSGI服务器版本可能已经足够了,但不一定可以移植到所有服务器或将来的服务器版本中。
例如,在此处使用Flask 1.0.2和Python 3.7.1,其中dict's maintain insertion order是语言规范的正式组成部分,Flask将标头插入request.header中,以便在环境中找到它们,通过将浏览器原始请求/响应标头与以下Flask应用程序的输出进行比较可以看出,标头与内部Flask服务器和gunicorn 19.5.0保持1:1的顺序匹配。
注意:该表格的存在只是为了简化测试get和post的过程,以查看在POST过程中content-type和content-length是否被不同地处理。
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