Python 无法在django视图中的请求会话中存储字典或对象

Python 无法在django视图中的请求会话中存储字典或对象,python,django,django-views,django-sessions,Python,Django,Django Views,Django Sessions,我试图在一个视图中设置会话,并在另一个视图中阅读此会话。正在尝试在会话中存储词典 request.session['staffdict'] = staffdict 当我尝试从第二个视图中的会话获取字典时: staffdict = request.session.get('staffdict') 我得到以下错误: Django版本:2.2.6 异常类型:TypeError 异常值: 类型为“UUID”的对象不可JSON序列化 异常位置:默认情况下为usr/lib/python3.6/json/

我试图在一个视图中设置会话,并在另一个视图中阅读此会话。正在尝试在会话中存储词典

request.session['staffdict'] = staffdict
当我尝试从第二个视图中的会话获取字典时:

staffdict = request.session.get('staffdict')
我得到以下错误:

Django版本:2.2.6 异常类型:TypeError 异常值:
类型为“UUID”的对象不可JSON序列化 异常位置:默认情况下为usr/lib/python3.6/json/encoder.py,第180行 Python可执行文件:/usr/local/bin/uwsgi Python版本:3.6.8


您在错误消息中得到响应。通过您的设置,django将对象序列化为json,并且您的字典包含没有序列化规则的非对象。

我建议你也读一读。然后你可以写这样的东西

导入uuid
导入json
类序列化UUIdencoder(json.JSONEncoder):
def默认值(自身,o):
如果isinstance(o,uuid.uuid):
返回{“{uuuuuid}:True,“val”:str(obj)}
返回super()。默认值(o)
def序列化挂钩(dkt:dict):
如果dkt中有“uuuuid_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
返回uuid.uuid(dkt[“val”])
返回dkt
类别所有者系列化器:
def转储(自身、obj):
返回json.dumps(obj,cls=SerializeUUIDEncoder.encode('latin-1'))
def加载(自身、数据):
返回json.loads(data.decode('latin-1'),object\u hook=serialize\u hook)

此代码使用json库方法的标准参数。您可以在文档和文档中阅读更多信息。

您在错误消息中得到响应。通过您的设置,django将对象序列化为json,并且您的字典包含没有序列化规则的非对象。

我建议你也读一读。然后你可以写这样的东西

导入uuid
导入json
类序列化UUIdencoder(json.JSONEncoder):
def默认值(自身,o):
如果isinstance(o,uuid.uuid):
返回{“{uuuuuid}:True,“val”:str(obj)}
返回super()。默认值(o)
def序列化挂钩(dkt:dict):
如果dkt中有“uuuuid_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
返回uuid.uuid(dkt[“val”])
返回dkt
类别所有者系列化器:
def转储(自身、obj):
返回json.dumps(obj,cls=SerializeUUIDEncoder.encode('latin-1'))
def加载(自身、数据):
返回json.loads(data.decode('latin-1'),object\u hook=serialize\u hook)
此代码使用json库方法的标准参数。您可以在文档和文档中阅读更多内容。

我使用pickle的dumps()和loads()函数,并将这些方法中的bytes对象转换为hex或从hex转换为:

import pickle
dict = {'s':'string', 'i':1}
hexdict = pickle.dumps(dict).hex()

# the above hexdict should be JSON OK

dict2 = pickle.loads(bytes.fromhex(hexdict))
print(dict2)
我使用pickle的dumps()和loads()函数,将这些方法中的bytes对象转换为hex或从hex转换为:

import pickle
dict = {'s':'string', 'i':1}
hexdict = pickle.dumps(dict).hex()

# the above hexdict should be JSON OK

dict2 = pickle.loads(bytes.fromhex(hexdict))
print(dict2)

对于使用pickle,有内置序列化程序
序列化程序。pickle序列化程序
。但pickle可能不适用于所有会话backends@GrzegorzBokota这就是我在代码中使用十六进制转换的原因。对于使用pickle,有内置序列化程序
序列化程序。pickle序列化程序
。但pickle可能不适用于所有会话backends@GrzegorzBokota这就是为什么我在代码中使用十六进制转换。