Diferencias de hora y fecha y hora en el error de activación de python

Estoy trabajando con una aplicación Django. Piroven y estoy haciendo una importante reelaboración de su funcionalidad. Como parte de esto, comencé a escribir un marco de prueba para él, ya que actualmente no tiene pruebas unitarias. A modo de fondo utiliza el Servicio Raven de la Universidad de Cambridge para la autenticación, y ofrece un backend de autenticación para Django para aprovechar este servicio.

El problema con el que me encuentro es probar el Respuesta WLS ficha de Raven. Esto forma una cadena de ! valores separados, que incluyen un campo de tiempo en el formato:

%Y%m%dT%H%M%SZ

En mi código de prueba, he creado esto como:

raven_issue = datetime.now().strftime('%Y%m%dT%H%M%SZ')

y luego lo devolvió a la URL de prueba para que la vista lo procesara. El problema viene con la validación de que esta vez no está demasiado lejos en el pasado para la validación de la respuesta. El código que valida esto utiliza:

def parse_time(t):
    """Converts a time of the form '20110729T123456Z' to a number of seconds
    since the epoch.
    @exception ValueError if the time is not a valid Raven time"""
    time_struct = time.strptime(t, "%Y%m%dT%H%M%SZ")
    return calendar.timegm(time_struct)

Ahora, cuando se pasa la cadena anterior desde el constructor datetime.now(), la validación de este valor analizado falla:

# Check that the issue time is not in the future or too far in the past:
if self.issue > time.time() + PYROVEN_MAX_CLOCK_SKEW:
    raise InvalidResponseError("The timestamp on the response is in the future")
if self.issue < time.time() - PYROVEN_MAX_CLOCK_SKEW - PYROVEN_TIMEOUT: 
    raise InvalidResponseError("The response has timed out")

Este código falla con mi prueba, alegando que la respuesta ha expirado. Los valores para PYROVEN_MAX_CLOCK_SKEW y PYROVEN_TIMEOUT son 2s y 10s respectivamente.

Esto plantea la pregunta: ¿hay alguna variabilidad en el manejo del tiempo que no entiendo? si pongo un datetime.now() valor generado, con un datetime.timedelta de 2 horas en el futuro, conviértalo en la cadena y páselo a la validación, que no falla a pesar de que la marca de tiempo está en el futuro, cuando debería. ¿Por qué es esto, como sugiere la lectura lógica del código?

preguntado el 10 de septiembre de 12 a las 22:09

Suena como un problema de zona horaria para mí; ¿estás en GMT+0200 por casualidad? -

Hmm podría ser - Soy Europa/Londres (BST) -

1 Respuestas

Se está confundiendo entre la hora local (según lo devuelto por datetime.now() y GMT (analizado por calendar.timegm()):

>>> t = datetime.now().strftime('%Y%m%dT%H%M%SZ')
>>> t
'20120910T232358Z'
>>> calendar.timegm(time.strptime(t, "%Y%m%dT%H%M%SZ"))
1347319438
>>> time.mktime(time.localtime())
1347312258.0
>>> time.mktime(time.strptime(t, "%Y%m%dT%H%M%SZ"))
1347312238.0

Conclusión: uso time.mktime en lugar de calendar.timegm para convertir sus valores en marcas de tiempo.

Respondido el 10 de Septiembre de 12 a las 22:09

Brillante, gracias, el manejo del tiempo ha sido un poco confuso para mí durante un tiempo, ¡gracias por la aclaración! - jvc26

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.