2012-09-10 24 views
1

Я работаю с приложением Django Pyroven и делаю некоторые важные изменения в его функциональности. В рамках этого я начал писать для него рамки тестирования, так как в настоящее время он не имеет модульных тестов. В качестве фона он использует University of Cambridge Raven service для аутентификации и предлагает сервер аутентификации для Django, чтобы использовать эту услугу.Разница во времени и Datetime в ошибке триггера python

Проблема, с которой я сталкиваюсь, проверяет токен WLS-Response от Ворона. Это формирует строку ! значений, разделенных, которые включают в себя поле времени в формате:

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

В моем коде тестирования я создал это как:

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

, а затем вернулся, что в URL тестирования для обработки по представлению. Проблема связана с проверкой того, что это время не слишком далеко в прошлом для проверки ответа. Код, который проверяет это использует:

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) 

Теперь, когда он передается строка выше от datetime.now() конструктор, проверка на этом проанализированного значения не удается:

# 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") 

Этот код не с моим тестом, утверждая, что ответ был исчерпан. Значения для PYROVEN_MAX_CLOCK_SKEW и PYROVEN_TIMEOUT составляют 2 с и 10 с соответственно.

Это задает вопрос, есть ли какая-то изменчивость в обработке времени, которую я не понимаю? Если я поместил генерируемое значение datetime.now() с datetime.timedelta из 2 часов в будущем, преобразуйте его в строку и передайте ее на проверку, которая не сработает, несмотря на то, что в будущем это будет время. Почему это, как предполагает логическое чтение кода?

+1

Звуки как вопрос с часовым поясом для меня, вы случайно на GMT + 0200? –

+0

Хм может быть - я Европа/Лондон (BST) – jvc26

ответ

2

Вы путаться между местным временем (возвращенного по datetime.now() и GMT (в разобрано 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 

Заключение:. Использовать time.mktime вместо calendar.timegm превратить ваши значения временных меток

+0

Блестящий - спасибо, обработка времени была для меня загадкой для в то время как - спасибо за разъяснение! – jvc26

Смежные вопросы