あなただけrequest.Session
をサブクラス化し、その__init__
とをオーバーロードできます。今あなたが新しいrequests.Sessionオブジェクトを作成する際のベースURLを指定することができますこのよう方法:
# 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)
そして、あなたのコード内でrequests.Session
するのではなく、あなたのサブクラスを使用することができます
は
from my_requests import SessionWithUrlBase
session = SessionWithUrlBase(url_base='https://stackoverflow.com/')
session.get('documentation') # https://stackoverflow.com/documentation
また、既存のコードベースを変更することを避けるために猿パッチrequests.Session
は(この実装であるべきでした互換性のある100%)が、任意のコードがrequests.Session()
を呼び出す前に、実際のパッチ適用を行うようにしてください:
# monkey_patch.py
import requests
class SessionWithUrlBase(requests.Session):
...
requests.Session = SessionWithUrlBase
そして:
# main.py
import requests
import monkey_patch
session = requests.Session()
repr(session) # <monkey_patch.SessionWithUrlBase object at ...>
私はこの答えを好きですが、ベースURLは 'urljoin'を取得し、POSTメソッドへのURLとして提供されるものでそれらを上書きするためなどの一切のサブレベルを持っていない場合にのみ、それが動作します。私は私のケースでそれが必要なので、私は単純な文字列の連結で 'urljoin'呼び出しを置き換えました –