Python 存储http请求的数据结构

Python data structure to store http request

我正在寻找处理和存储 http 请求的想法/技巧 headers。 我需要保留 headers 的顺序并准备好重复 (甚至是键和值的重复项)。

无论是字典还是有序字典都不能满足这里的目的。

这些需求通常使用什么data-structures?

使用 (header, value) 个元组(或 collections.namedtuple)的列表:

headers = [('Host', 'abc.com'), ('User-Agent', 'Mozilla'), ('Host', '123.com'), ('TE', 'chunked'), ('User-Agent', 'Safari')]

这将保留每个 header 的条目顺序,并且还将保留重复项。

查找不会像字典那样高效,但(大概)每个请求的 header 数量不会很大。您可以使用列表理解或生成器表达式(如果更合适)进行查找。例子 查找 User-Agent:

user_agents = [header for header in headers if header[0].lower() == 'user-agent']
>>> user_agents
[('User-Agent', 'Mozilla'), ('User-Agent', 'Safari')]

将其包装在提供 add_header(header, value)get_header(header) 方法的 class 中相当容易。您可以通过实现 __getitem__() 来提供类似字典的名称查找。我会把它留作练习。

字典可以解决这个问题: 假设您有一个元组列表(header,value) 例如:

headers = [('User-Agent', 'Mozilla'),('User-Agent', 'Chrome'), ('Content-Type', 'application/json')]

values= {}

for k, v in headers:
    setdefault(k, []).append(v)

这将保留入场顺序并重复

print(values)
{'User-Agent': ['Mozilla', 'Chrome'], 'Content-Type': ['application/json']}