在视图中我有:
from datetime import timedelta
from django.utils import timezone
now = timezone.now()
self.request.session.set_expiry(now + timedelta(days=365))
但它提出了
datetime.datetime(2016,6,24,17,19,0,026661,tzinfo =)不是 JSON可序列化
我找到了一个解决方案:
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
但它仅适用于Chrome ...在Safari django中会引发错误
UnpicklingError at / invalid load key,'{'。
有什么建议吗?
self.request.session.set_expiry(int(timedelta(days=365).total_seconds()))
答案 0 :(得分:3)
set_expiry(值)
设置会话的到期时间。您可以传递许多不同的值:
- 如果value是一个整数,则会话将在经过多秒不活动后到期。例如,调用request.session.set_expiry(300)会使会话在5分钟后到期。
- 如果value是datetime或timedelta对象,则会话将在该特定日期/时间到期。请注意,如果您使用的是PickleSerializer,则datetime和timedelta值只能序列化。
- 如果值为0,则当用户的Web浏览器关闭时,用户的会话cookie将过期。
- 如果value为None,则会话将恢复为使用全局会话到期策略。
所以,你得到了预期的行为。如果要将日期时间传递给session.set_expiry,则必须使用PickleSerializer。 在我看来,你提出的解决方法,它实际上是最好的解决方案,并继续使用JSONSerializer。