我有一个节点对象:
class Node:
def __init__(self, name=None, parent=None):
self._name = name
self._parent = parent
self._children = set()
我有一个字典,其id(str)为键,此节点对象为value e.g。
rec_dict[rec_id] = Node(rec_name, parent)
创建此rec_dict后。我想将它保存到会话中以提供多个django请求。我在做的时候遇到了以下错误:
request.session['rec_dict'] = rec_dict
TypeError: <Node object at 0x7f6b066361d0> is not JSON serializable
我也试过
json.dumps(rec_dict)
和
serializer.serialize(rec_dict)
但它们都没有工作,因为value是一个节点对象。请告诉我如何在会话或任何解决方法中存储此rec_dict以执行相同操作。 提前谢谢!
答案 0 :(得分:0)
Django默认在JSON
中序列化会话。如果绝对必须支持在会话变量中存储复杂对象,则可以通过在settings.py
中定义会话序列化程序将其更改为django.contrib.sessions.serializers.PickleSerializer
:
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
只要有可能,最好在会话中存储简单的标识符,例如主键或某种自然键,可用于在运行时重新创建所需的对象。
<强>味酸强>
Pickle
专门用于序列化所有Python。但是,有一个大红色警告on the docs:
泡菜模块不能防止错误或 恶意构造的数据。切勿取消从中收到的数据 不受信任或未经认证的来源。
Pickle强加了安全风险,因为Web应用程序的交互性通常容易受到攻击。这就是为什么在许多广泛使用的应用程序/软件包(例如Django
或Celery
)中,它作为默认设置被删除,只作为选项保留。
答案 1 :(得分:0)
您不应该在会话中存储模型实例。即使您确实成功地将它们序列化,当您稍后在另一个视图中对它们进行反序列化时,您将获得原始值,即使数据库中的数据在此期间发生了更改。
相反,存储ID,并在需要时从数据库中取回它们。