Я пытаюсь реорганизовать некоторый код, в котором выполняется множество HTTP-запросов с использованием модуля requests. Многие из этих запросов имеют (частично) те же заголовки, поэтому я хотел бы «предварительно заполнить» их, используя Session objects.Предварительно заполняющие заголовки запросов с использованием классов, полученных из запросов. Сессия в Python
Однако в этом контексте у меня возникают трудности с выполнением нескольких операций наследования. Вот то, что я пробовал:
import requests, time
requestbin_URL = 'http://requestb.in/1nsaz9y1' # For testing only; remains usable for 48 hours
auth_token = 'asdlfjkwoieur182932385' # Fake authorization token
class AuthorizedSession(requests.Session):
def __init__(self, auth_token):
super(AuthorizedSession, self).__init__()
self.auth_token = auth_token
self.headers.update({'Authorization': 'token=' + self.auth_token})
class JSONSession(requests.Session):
def __init__(self):
super(JSONSession, self).__init__()
self.headers.update({'content-type': 'application/json'})
class AuthorizedJSONSession(AuthorizedSession, JSONSession):
def __init__(self, auth_token):
AuthorizedSession.__init__(self, auth_token=auth_token)
JSONSession.__init__(self)
""" These two commented-out requests work as expected """
# with JSONSession() as s:
# response = s.post(requestbin_URL, data={"ts" : time.time()})
# with AuthorizedSession(auth_token=auth_token) as s:
# response = s.post(requestbin_URL, data={"key1" : "value1"})
""" This one doesn't """
with AuthorizedJSONSession(auth_token=auth_token) as s:
response = s.post(requestbin_URL, data={"tag" : "some_tag_name"})
Если я проверить результат последнего запроса на http://requestb.in/1nsaz9y1?inspect, я вижу следующее:
Похоже, что Content-Type
поле установлено правильно до application/json
; однако я не вижу заголовок Authorization
с поддельным токеном аутентификации. Как я могу объединить классы AuthorizedSession
и JSONSession
, чтобы увидеть оба?
С тех пор я перешел на Python 3, в котором 'super' может быть вызван в форме с нулевым аргументом:' super() .__ init __ (auth_token = auth_token) '. –