Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:将包含对象的python dict转换为json_Django_Python 3.x - Fatal编程技术网

Django:将包含对象的python dict转换为json

Django:将包含对象的python dict转换为json,django,python-3.x,Django,Python 3.x,我将节点对象设置为: class Node: def __init__(self, name=None, parent=None): self._name = name self._parent = parent self._children = set() 我有一个字典,idstr作为键,这个节点对象作为值 e、 g 创建此记录后,我想将其保存到一个会话中,以服务多个django请求。执行此操作时,我遇到以下错误: request.se

我将节点对象设置为:

class Node:
    def __init__(self, name=None, parent=None):
        self._name = name
        self._parent = parent
        self._children = set()
我有一个字典,idstr作为键,这个节点对象作为值 e、 g

创建此记录后,我想将其保存到一个会话中,以服务多个django请求。执行此操作时,我遇到以下错误:

request.session['rec_dict'] = rec_dict

TypeError: <Node object at 0x7f6b066361d0> is not JSON serializable

但它们都不起作用,因为值是节点对象。请告诉我如何将此记录存储在会话或任何解决方法中。
提前谢谢

Django默认使用JSON序列化会话。如果绝对必须支持在会话变量中存储复杂对象,则可以通过在settings.py中定义会话序列化程序将其更改为:

只要有可能,最好在会话中存储简单的标识符,例如主键或某种自然键,您可以使用它们在运行时重新创建所需的对象

腌菜

Pickle专门用于序列化Python中的所有内容。然而,有一个巨大的红色警告:

pickle模块不用于防止错误或错误的操作 恶意构造的数据。从不解除从服务器接收的ICKICK数据 不可信或未经验证的来源


Pickle带来了安全风险,而web应用程序由于其交互性质往往容易受到攻击。这就是为什么在许多广泛使用的应用程序/软件包(如Django或芹菜)中,它作为默认值被删除,而只作为选项保留在中。

您不应该在会话中存储模型实例。即使您成功地将它们序列化,当您稍后在另一个视图中反序列化它们时,您将获得与最初相同的值,即使数据库中的数据在此期间发生了更改

相反,存储ID,并在需要时从数据库中取回它们

request.session['rec_dict'] = rec_dict

TypeError: <Node object at 0x7f6b066361d0> is not JSON serializable
json.dumps(rec_dict)
serializer.serialize(rec_dict)
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'