2

在我看来:

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, 826661, tzinfo=) 不是 JSON 可序列化的

我找到了一种解决方案:

SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'

但它仅适用于 Chrome ...在 Safari django 中引发错误

UnpicklingError at / invalid load key, '{'.

有什么建议么?


解决方法 #1

self.request.session.set_expiry(int(timedelta(days=365).total_seconds()))
4

1 回答 1

4

根据Django 文档

set_expiry(值)

设置会话的到期时间。您可以传递许多不同的值:

  • 如果 value 是一个整数,会话将在几秒的不活动后过期。例如,调用 request.session.set_expiry(300) 将使会话在 5 分钟后过期。
  • 如果 value 是 datetime 或 timedelta 对象,则会话将在该特定日期/时间到期。请注意,只有在使用 PickleSerializer 时,datetime 和 timedelta 值才可序列化。
  • 如果值为 0,则用户的会话 cookie 将在用户的 Web 浏览器关闭时过期。
  • 如果值为 None,则会话恢复为使用全局会话到期策略。

所以,你得到了预期的行为。如果要将日期时间传递给 session.set_expiry,则必须使用 PickleSerializer。在我看来,您提出的解决方法实际上是最好的解决方案,并继续使用 JSONSerializer。

于 2015-06-26T03:58:58.367 回答