您可能需要提供一个更完整的示例,因为编写的 auth 插件每次都会添加标题。
import requests
import requests_mock
class SimpsonsAuth(requests.auth.AuthBase):
def __call__(self, r):
# Implement my authentication
r.headers['Authentication'] = "Crusty the Clown"
return r
with requests_mock.mock() as m:
m.get('http://test.com', text='resp')
resp = requests.get('http://test.com', auth=SimpsonsAuth())
print(m.last_request.headers)
印刷
{'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authentication': 'Crusty the Clown'}
然后更多地是关于如何实现身份验证插件,以及如何处理流程,从内置的 Digest Auth进行基本复制:
import requests
import requests_mock
class SimpsonsAuth(requests.auth.AuthBase):
def __init__(self, *args, **kwargs):
super(SimpsonsAuth, self).__init__(*args, **kwargs)
self.header = None
def handle_401(self, r, **kwargs):
if r.status_code == 401:
# do some stuff
self.header = "Crusty the Clown"
prep = r.request.copy()
prep.headers['Autentication'] = self.header
_r = r.connection.send(prep, **kwargs)
_r.history.append(r)
_r.request = prep
return _r
return r
def __call__(self, r):
r.register_hook('response', self.handle_401)
if self.header:
r.headers['Authentication'] = self.header
return r
with requests_mock.mock() as m:
m.get('http://test.com',
text='resp',
request_headers={'Authentication': 'Crusty the Clown'})
m.get('http://test.com', status_code=401)
auth = SimpsonsAuth()
resp = requests.get('http://test.com', auth=auth)
for req in m.request_history:
print(req.url, req.headers)
退货
http://test.com/ {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
http://test.com/ {'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Autentication': 'Crusty the Clown'}