1

私はDjangoアプリPyrovenを使用しており、その機能のいくつかの主要な再作業を行っています。この一環として、現在ユニットテストがないため、テストフレームワークの作成を開始しました。バックグラウンドとして、ケンブリッジ大学のRavenサービスを認証に使用し、 Djangoがこのサービスを活用するための認証バックエンドを提供します。

私が遭遇している問題は、Ravenからの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()生成された値を2時間先に置いた場合datetime.timedelta、それを文字列に変換して検証に渡します。これは、タイムスタンプが将来であっても失敗しません。コードの論理的な読み取りが示唆しているように、これはなぜですか?

4

1 に答える 1

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して、値をタイムスタンプに変換します。

于 2012-09-10T21:25:06.527 に答える