2016-10-28 1 views
0

Я пытаюсь реорганизовать некоторый код, в котором выполняется множество 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, я вижу следующее:

enter image description here

Похоже, что Content-Type поле установлено правильно до application/json; однако я не вижу заголовок Authorization с поддельным токеном аутентификации. Как я могу объединить классы AuthorizedSession и JSONSession, чтобы увидеть оба?

ответ

0

Я обнаружил, что запрос работает, если я определить более AuthorizedJSONSession просто следующим образом:

class AuthorizedJSONSession(AuthorizedSession, JSONSession): 
    def __init__(self, auth_token): 
     super(AuthorizedJSONSession, self).__init__(auth_token=auth_token) 

Полученный запрос теперь обновил оба Authorization и Content-Type заголовки:

enter image description here

Я понял, что когда класс наследует от нескольких классов, которые, в свою очередь, наследуются от одного и того же базового класса, тогда Python достаточно «достаточно умен», чтобы просто использовать super для инициализации.

+0

С тех пор я перешел на Python 3, в котором 'super' может быть вызван в форме с нулевым аргументом:' super() .__ init __ (auth_token = auth_token) '. –

 Смежные вопросы

  • Нет связанных вопросов^_^