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?
@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.
Comentários muito úteis
Por que não apenas shim o método
request
?