扩展会话“datetime不是JSON可序列化”的问题

时间:2015-06-25 17:25:32

标签: django django-sessions django-1.8

在视图中我有:

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,'{'。

有什么建议吗?

解决方法#1

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

1 个答案:

答案 0 :(得分:3)

根据Django documentation

  

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。