6

我正在创建一个使用访问令牌的简单 Django API。这个想法是,当用户请求令牌时,所述令牌在接下来的 7 小时内有效。

但是,在生成令牌时,我获得了 Python NonExistentTimeError。代码是:

 #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 期望使用时区感知的日期时间对象

从 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.

两者都datetime.now()返回datetime.utcnow()天真datetime的对象,这不是 Django 需要的。将时区应用到 后expires,Django 就能够转换回 UTC,以便在数据库后端存储为 UTC。

NonExistentTimeError实际上是由pytz模块中的代码抛出的。pytz文档绝对值得一读,因为在处理时区时有很多陷阱。

于 2013-03-10T02:57:22.893 回答