gpt4 book ai didi

Python 3 Requests 或 urllib - 如何始终添加 header ?

转载 作者:行者123 更新时间:2023-11-30 22:50:13 25 4
gpt4 key购买 nike

标题说明了一切:是否有一种“最佳”方法始终为每个请求添加 header ?我有一个内部工具想要将请求 ID 发送到其他内部工具;我正在寻找一个幸运的解决方案。我浏览了两者的文档,似乎这不是一个受欢迎的要求,因为我找不到食谱示例。

我正在考虑几个解决方案:

  1. 将请求包装在我自己的薄包装器中并使用它。需要教会共同开发人员记住不要导入请求,而是将 myrequestswrapper 作为请求导入
  2. 猴子补丁请求。我不喜欢猴子修补,但也许就这一次......?我害怕有时需要向这个特定系统发送 header 。

编辑:为什么我不考虑 requests.Session:它存储 cookie,并且需要在保持连接打开时进行处理。

最佳答案

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

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

并使用 session 来执行请求。正如您所说,您不希望在请求之间保留 cookie,您可以对 Session 进行子类化:

In [64]: from requests.adapters import HTTPAdapter

In [65]: from requests.cookies import cookiejar_from_dict

In [66]: class CookieMonsterSession(Session):
...:
...: def __init__(self, *args, **kwgs):
...: super(CookieMonsterSession, self).__init__(*args, **kwgs)
...: # Override default adapters with 0-pooling adapters
...: self.mount('https://', HTTPAdapter(pool_connections=1,
...: pool_maxsize=0))
...: self.mount('http://', HTTPAdapter(pool_connections=1,
...: pool_maxsize=0))
...: @property
...: def cookies(self):
...: """ Freshly baked cookies, always!"""
...: return cookiejar_from_dict({})
...: @cookies.setter
...: def cookies(self, newcookies):
...: """ OM NOM NOM NOM..."""
...: pass
...:

In [67]: s = CookieMonsterSession()

In [69]: real_s = Session()

In [70]: s.get('http://www.google.fi')
Out[70]: <Response [200]>

In [71]: s.cookies
Out[71]: <RequestsCookieJar[]>

In [72]: real_s.get('http://www.google.fi')
Out[72]: <Response [200]>

In [73]: real_s.cookies
Out[73]: <RequestsCookieJar[Cookie(version=0, name='NID', value='86=14qy...Rurx', port=None, port_specified=False, domain='.google.fi', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1489744358, discard=False, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False)]>

不幸的是,Session 在设计上很难扩展和配置,因此“禁用”cookie,并像这样修改池化是一种黑客行为,并且很容易被破坏,如果 Session 有轻微更新。此外,我们仅针对持久 header 禁用了 Session 的 2 个主要功能。

包装基本的 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"
}
}

关于Python 3 Requests 或 urllib - 如何始终添加 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39477838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com