6

アクセストークンが使用される単純なDjangoAPIを作成しています。アイデアは、ユーザーがトークンを要求すると、そのトークンは次の7時間有効であるということです。

ただし、トークンを生成すると、PythonNonExistentTimeErrorが発生します。コードは次のとおりです。

 #Django view
 ...
 expires = datetime.datetime.now() + datetime.timedelta(hours=7)

 token = APIMasterToken.objects.create(
     token=token,
     expiration_date=expires
 )

ただし、上記の日付でトークンを生成する例外が発生します。

NonExistentTimeError at /api/obtain_master_token/
2013-03-10 02:05:12.179508

このエラーは何を意味し、どうすれば解決できますか?

編集:ドキュメントを読んだところ、DSTに続いて時計が変更される日が発生すると、このエラーが発生するようです。しかし、どうすれば問題が解決するのかわかりません。timedelta関数はこれを処理するべきではありませんか?

4

1 に答える 1

8

Django は、タイムゾーン対応の datetime オブジェクトで動作することを想定しています。

Django のドキュメントから、now()呼び出しは次のようになります。

import datetime
from django.utils.timezone import utc

now = datetime.datetime.utcnow().replace(tzinfo=utc)
expires = now + datetime.timedelta(hours=7)

さらに良いのは、 のnow()関数を使用することdjango.utils.timezoneです。

との両方が、 Django が必要とするものではない単純なオブジェクトをdatetime.now()返しdatetime.utcnow()ます。datetimeにタイム ゾーンが適用されるとexpires、Django はデータベース バックエンドで UTC として格納するために UTC に戻すことができます。

NonExistentTimeError、実際にはpytzモジュールからのコードによってスローされます。タイムゾーンを扱う際には多くの落とし穴があるため、pytz のドキュメントは間違いなく読む価値があります

于 2013-03-10T02:57:22.893 に答える