繁体   English   中英

以与Flask中接收的相同顺序获取请求标头

[英]Getting request headers in the same order they are received in Flask

在基于Flask的应用程序中,是否可以以获取请求标头的顺序来获取请求标头(例如,如nc所示)?

当前,我正在使用request.headers.keys() (正在request传入的请求对象),但是它不能保证顺序。

我知道在HTTP中顺序或标题无关紧要,但是我想知道是否可以这样做。 例如,为HTTP应用程序实现一个记录器工具,该工具可打印接收到的确切请求(类似于nc )。

我认为您是正确的,因为不能保证顺序,但是取决于WSGI环境中WSGI服务器提供的顺序,并且可能会因所使用的服务器而异。

如果您可以在3.7+上验证并修复python版本以及所使用的WSGI服务器的版本,这可能就足够了,但不一定可以移植到所有服务器或将来的服务器版本中。

例如,在这里使用Flask 1.0.2和Python 3.7.1,其中dict将维护插入顺序作为语言规范的正式组成部分,并且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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM