Python 请求:Session 中的 URL 基础

新手上路,请多包涵

使用会话时,您似乎每次都需要提供完整的 URL,例如

session = requests.Session()
session.get('http://myserver/getstuff')
session.get('http://myserver/getstuff2')

这有点乏味。有没有办法做类似的事情:

 session = requests.Session(url_base='http://myserver')
session.get('/getstuff')
session.get('/getstuff2')

原文由 paj28 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 691
2 个回答

requests_toolbelt.sessions.BaseUrlSession https://github.com/requests/toolbelt/blob/f5c86c51e0a01fbc8b3b4e1c286fd5c7cb3aacfa/requests_toolbelt/sessions.py#L6

注意:这使用标准库中的 urljoin。当心 urljoin 的行为。

 In [14]: from urlparse import urljoin

In [15]: urljoin('https://localhost/api', '/resource')
Out[15]: 'https://localhost/resource'

In [16]: urljoin('https://localhost/api', 'resource')
Out[16]: 'https://localhost/resource'

In [17]: urljoin('https://localhost/api/', '/resource')
Out[17]: 'https://localhost/resource'

In [18]: urljoin('https://localhost/api/', 'resource')
Out[18]: 'https://localhost/api/resource'

或者

import requests
from functools import partial

def PrefixUrlSession(prefix=None):
     if prefix is None:
         prefix = ""
     else:
         prefix = prefix.rstrip('/') + '/'

     def new_request(prefix, f, method, url, *args, **kwargs):
         return f(method, prefix + url, *args, **kwargs)

     s = requests.Session()
     s.request = partial(new_request, prefix, s.request)
     return s

原文由 khluasdfikuljasdlkfasd 发布,翻译遵循 CC BY-SA 4.0 许可协议

此功能已在论坛上被问过几次 1 , 2 , 3此处 记录的首选方法是子类化,如下所示:

 from requests import Session
from urllib.parse import urljoin

class LiveServerSession(Session):
    def __init__(self, base_url=None):
        super().__init__()
        self.base_url = base_url

    def request(self, method, url, *args, **kwargs):
        joined_url = urljoin(self.base_url, url)
        return super().request(method, joined_url, *args, **kwargs)

您可以简单地使用它,如下所示:

 baseUrl = 'http://api.twitter.com'
with LiveServerSession(baseUrl) as s:
    resp = s.get('/1/statuses/home_timeline.json')

原文由 rouble 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题