Requests: Solicitud de función: agregar tiempo de espera a la sesión

Creado en 21 abr. 2014  ·  11Comentarios  ·  Fuente: psf/requests

Parece que todos los parámetros opcionales que se envían también se pueden configurar en la sesión (por ejemplo, verificar, transmitir, etc.). Excepto el tiempo de espera.

¿Sería posible cambiar el comportamiento para que el tiempo de espera se fusione desde la sesión al igual que todos los demás argumentos?

Comentario más útil

¿Por qué no simplemente calzar el 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 comentarios

@ctheiss ¡Oye, gracias por plantear este problema!

Esto es algo que surgió antes, más recientemente en # 1987 pero también en # 1130 y # 1563 (todo este año). En general, Kenneth ha expresado una falta de interés en realizar este cambio, esperando que se haga utilizando adaptadores de transporte. Si está interesado en obtener orientación sobre cómo lo haría, me complace ayudarlo, pero no creo que agreguemos timeout al Session .

¡Lo sentimos, no podemos ser más útiles!

Gracias por la respuesta ultrarrápida. Necesito mejorar en la búsqueda de los problemas, ya que los que mencionaste son duplicados exactos.

¿Es la idea implementar BaseAdapter (o subclase HTTPAdapter ) y luego asociar la subclase con una sesión usando mount ? Parece extrañamente laborioso implementar el "tiempo de espera predeterminado" (dado lo increíblemente fácil que es todo lo demás en las solicitudes).

La idea sería subclase HTTPAdapter . No es muy laborioso, en realidad, pero la principal razón por la que lo hacemos es porque mantiene una distinción conceptual en la biblioteca. Session objetos

Para aclarar, ¿su recomendación es que la gente haga esto?

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 esa es una opción. sí

Pero, más específicamente, ¿es la _recomendación_?

No hay una recomendación específica porque las necesidades de los usuarios variarán y habrá una multitud de formas de abordar esto para esos usuarios.

@staticshock @ sigmavirus24

Esa solución parece demasiado complicada. Lo siguiente parece funcionar para mí.

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

Esa solución parece demasiado complicada. Lo siguiente parece funcionar para mí.

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')

Tenga en cuenta que también deberá aplicar esto a los otros verbos, por ejemplo, post , put etc. si los usa. Para completar, esto es lo que estoy 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 qué no simplemente calzar el 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')

Si lo necesita globalmente a nivel de módulo y no está utilizando sesiones, podría hacer lo siguiente:

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

No estoy seguro de cómo funciona esto con su uso en múltiples módulos, me imagino que necesitaría la corrección en cada archivo donde está usando solicitudes.

¿Fue útil esta página
0 / 5 - 0 calificaciones