首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取请求报头的顺序与在Flask中接收的顺序相同

获取请求报头的顺序与在Flask中接收的顺序相同
EN

Stack Overflow用户
提问于 2019-04-19 01:55:44
回答 1查看 178关注 0票数 1

在基于Flask的应用程序中,有没有办法以获取请求报头的相同顺序来获取它们(例如,就像nc所显示的那样)?

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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期间是否有不同的处理方式。

代码语言:javascript
复制
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()

输出:

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55751419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档