Requests: Solicitação de recurso: adicionar tempo limite à sessão

Criado em 21 abr. 2014  ·  11Comentários  ·  Fonte: psf/requests

Parece que cada parâmetro opcional enviado para envio também pode ser configurado na Sessão (por exemplo, verificar, transmitir, etc.). Exceto tempo limite.

Seria possível alterar o comportamento para que o tempo limite seja mesclado da sessão como todos os outros argumentos?

Comentários muito úteis

Por que não apenas shim o método request ?

s = requests.Session()
s.request = functools.partial(s.request, timeout=3)
# this should now timeout
s.get('https://httpbin.org/delay/6')

Todos 11 comentários

@ctheiss Ei, obrigado por levantar esse problema!

Isso é algo que surgiu antes, mais recentemente em # 1987, mas também em # 1130 e # 1563 (todo este ano). Kenneth geralmente expressou falta de interesse em fazer essa alteração, esperando que fosse feito usando adaptadores de transporte. Se estiver interessado em obter alguma orientação sobre como fazer isso, fico feliz em ajudar, mas não acho que iremos adicionar timeout ao Session .

Desculpe, não podemos ser mais úteis!

Obrigado pela resposta ultrarrápida. Preciso melhorar a pesquisa dos problemas, pois os que você mencionou são duplicatas exatas!

A ideia é implementar BaseAdapter (ou subclasse HTTPAdapter ) e, em seguida, associar a subclasse a uma sessão usando mount ? Isso parece estranhamente trabalhoso apenas para implementar o "tempo limite padrão" (dada a incrível facilidade de todo o resto nas solicitações).

A ideia seria criar uma subclasse de HTTPAdapter . Não é muito trabalhoso, realmente, mas a principal razão de o fazermos é porque mantém uma distinção conceitual na biblioteca. Objetos Session estritamente devem gerenciar coisas sobre a sessão que sobre como o próprio HTTP funciona: cookies, cabeçalhos etc. Os adaptadores de transporte gerenciam coisas que são sobre como as conexões de rede funcionam: soquetes, tempos limite etc.

Para esclarecer, sua recomendação é que as pessoas façam isso?

class MyHTTPAdapter(requests.adapters.HTTPAdapter):
    def __init__(self, timeout=None, *args, **kwargs):
        self.timeout = timeout
        super(MyHTTPAdapter, self).__init__(*args, **kwargs)

    def send(self, *args, **kwargs):
        kwargs['timeout'] = self.timeout
        return super(MyHTTPAdapter, self).send(*args, **kwargs)

s = requests.Session()
s.mount("http://", MyHTTPAdapter(timeout=10))

@staticshock é uma opção. sim

Mas, mais especificamente, é a _recomendação_?

Não há recomendação específica porque as necessidades dos usuários variam e haverá uma infinidade de maneiras de lidar com isso para esses usuários.

@staticshock @ sigmavirus24

Essa solução parece excessivamente complicada. O seguinte parece funcionar para mim.

s = requests.Session()
s.get_orig, s.get = s.get, functools.partial(s.get, timeout=3)
# this should now timeout
s.get('https://httpbin.org/delay/6')
# and this should succeed
s.get_orig('https://httpbin.org/delay/6')

@staticshock @ sigmavirus24

Essa solução parece excessivamente complicada. O seguinte parece funcionar para mim.

s = requests.Session()
s.get_orig, s.get = s.get, functools.partial(s.get, timeout=3)
# this should now timeout
s.get('https://httpbin.org/delay/6')
# and this should succeed
s.get_orig('https://httpbin.org/delay/6')

Observe que você também precisará aplicar isso aos outros verbos, por exemplo, post , put etc. se você os usar. Para completar, aqui está o que estou usando:

session = requests.Session()
for method in ('get', 'options', 'head', 'post', 'put', 'patch', 'delete'):
    setattr(session, method, functools.partial(getattr(session, method), timeout=5))
# All methods of session should now timeout after 5 seconds

Por que não apenas shim o método request ?

s = requests.Session()
s.request = functools.partial(s.request, timeout=3)
# this should now timeout
s.get('https://httpbin.org/delay/6')

Se você precisar globalmente no nível do módulo e não estiver usando sessões, poderá fazer o seguinte:

requests.api.request = functools.partial(requests.api.request, timeout=3)

Não tenho certeza de como isso funciona com o uso em vários módulos, imagino que você precise do shim em cada arquivo em que estiver usando solicitações.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Matt3o12 picture Matt3o12  ·  3Comentários

cnicodeme picture cnicodeme  ·  3Comentários

remram44 picture remram44  ·  4Comentários

avinassh picture avinassh  ·  4Comentários

tiran picture tiran  ·  3Comentários