Python3请求或urllib如何总是添加头?

2024-05-23 20:03:55 发布

您现在位置:Python中文网/ 问答频道 /正文

标题说明了一切:有没有一种“最好”的方式总是在每个请求中添加一个头?我有一个内部工具,它想把请求id发送给其他内部工具;我正在寻找一个好的解决方案。我浏览了这两本书的文档,似乎这不是一个很受欢迎的要求,因为我找不到烹饪书的例子。在

我在想几个解决方案:

  1. 用我自己的薄纸包装请求并使用它。需要教代码开发人员记住不要import requests而是import myrequestswrapper as requests。在
  2. 猴子补丁请求。我不喜欢猴子打补丁,但也许就这一次。。。?我害怕有必要向这个特定的系统发送一个头文件。在

编辑:为什么我不考虑请求。会话:它存储Cookie,需要在保持连接打开时进行处理。在


Tags: 工具代码文档importid标题开发人员方式
1条回答
网友
1楼 · 发布于 2024-05-23 20:03:55

创建一个session object,这是advanced usage下面显示的第一件事:

s = requests.Session()
s.headers.update({'x-some-header': 'the value'})
s.get('http://httpbin.org/headers')

并使用会话执行请求。如您所述,您不希望在请求之间持久化cookies,您可以将Session子类化:

^{pr2}$

不幸的是,Session在设计上很难扩展和配置,所以“禁用”cookie和像这样修改池是一种黑客行为,并且在{}更新一点点的时候很容易被破坏。此外,我们还禁用了Session的两个主要功能,仅用于持久化头。在

包装基本API方法可能是更干净、更安全的方法:

# customrequests.py
from functools import wraps
from requests import api as requests_api

custom_headers = {}


def _header_wrapper(f):
    @wraps(f)
    def wrapper(*args, **kwgs):
        headers = kwgs.pop('headers', None) or {}
        headers.update(custom_headers)
        return f(*args, headers=headers, **kwgs)

    return wrapper

request = _header_wrapper(requests_api.request)
get = _header_wrapper(requests_api.get)
options = _header_wrapper(requests_api.options)
head = _header_wrapper(requests_api.head)
post = _header_wrapper(requests_api.post)
put = _header_wrapper(requests_api.put)
patch = _header_wrapper(requests_api.patch)
delete = _header_wrapper(requests_api.delete)

实际操作:

In [1]: import customrequests as requests

In [2]: print(requests.get('http://httpbin.org/headers').text)
{
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.11.1"
  }
}


In [3]: requests.custom_headers['X-Test'] = "I'm always here"

In [4]: print(requests.get('http://httpbin.org/headers').text)
{
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.11.1", 
    "X-Test": "I'm always here"
  }
}

相关问题 更多 >