1 回答

TA贡献1784条经验 获得超9个赞
要么编写自己的会话序列化器以允许您datetime直接序列化对象,要么datetime以其他形式存储值。
如果要将其保存为秒,请使用以下datetime.timestamp()方法:
request.session[social_ticketing_cookie_name(request.event)] = {
'code': code,
'expiry_date': expiry_date.timestamp()
}
您自己的SESSION_SERIALIZER类只需要提供loads和dumps方法,直接类似于json.loads()和json.dumps()(这是标准 JSON 序列化器的实现方式)。
如果您想对datetime对象进行编码并能够将它们datetime再次透明地转换回对象,我将使用嵌套对象格式将此类值标记为特殊值:
from datetime import datetime
class JSONDateTimeSerializer:
@staticmethod
def _default(ob):
if isinstance(ob, datetime):
return {'__datetime__': ob.isoformat()}
raise TypeError(type(ob))
@staticmethod
def _object_hook(d):
if '__datetime__' in d:
return datetime.fromisoformat(d['__datetime__'])
return d
def dumps(self, obj):
return json.dumps(
obj, separators=(',', ':'), default=self._default
).encode('latin-1')
def loads(self, data):
return json.loads(
data.decode('latin-1'), object_hook=self._object_hook
)
并设置SESSION_SERIALIZER为上述模块的全限定名 ( path.to.module.JSONDateTimeSerializer)。
以上使用了Python 3.7 中新增的datetime.fromisoformat()方法。
添加回答
举报