0

我知道我可以轻松地使用 requests-mock 快速获取呼叫/自定义会话呼叫。现在我有一个自定义身份验证器:

 class SimpsonsAuth(requests.auth.AuthBase):
     def __call__(self, r):
         # Implement my authentication
         r.headers['Authentication'] = "Crusty the Clown"
         return r
>>> import requests
>>> import requests_mock

>>> with requests_mock.mock() as m:
...     m.get('http://test.com, text='resp')
...     resp = requests.get('http://test.com', auth=SimpsonsAuth())

当被嘲笑者get没有提高身份验证时。如何启动该身份验证处理程序?

4

1 回答 1

0

您可能需要提供一个更完整的示例,因为编写的 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'}
于 2020-12-15T03:02:16.327 回答