można tylko podklasy request.Session
przeciążenia jego __init__
i request
metody takie jak to:
# my_requests.py
import requests
class SessionWithUrlBase(requests.Session):
# In Python 3 you could place `url_base` after `*args`, but not in Python 2.
def __init__(self, url_base=None, *args, **kwargs):
super(SessionWithUrlBase, self).__init__(*args, **kwargs)
self.url_base = url_base
def request(self, method, url, **kwargs):
# Next line of code is here for example purposes only.
# You really shouldn't just use string concatenation here,
# take a look at urllib.parse.urljoin instead.
modified_url = self.url_base + url
return super(SessionWithUrlBase, self).request(method, modified_url, **kwargs)
A potem można użyć swoją podklasę zamiast requests.Session
w kodzie:
from my_requests import SessionWithUrlBase
session = SessionWithUrlBase(url_base='https://stackoverflow.com/')
session.get('documentation') # https://stackoverflow.com/documentation
Również można małpa-łata requests.Session
uniknąć modyfikując istniejące codebase (implementacja ta powinna być 100% kompatybilny), ale należy to zrobić przed wywołuje rzeczywiste łatanie dowolny kod requests.Session()
:
# monkey_patch.py
import requests
class SessionWithUrlBase(requests.Session):
...
requests.Session = SessionWithUrlBase
, a następnie:
# main.py
import requests
import monkey_patch
session = requests.Session()
repr(session) # <monkey_patch.SessionWithUrlBase object at ...>
lubię tę odpowiedź, ale to działa tylko wtedy, gdy baza url ma podpoziomów jak bo 'urljoin' nadpisuje je z tym, co jest warunkiem uzyskania jak URL i metod post. potrzebowałem go w moim przypadku, więc zamieniłem wywołanie 'urljoin' z prostą konkatenacją ciągów –