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

时间:2015-04-27 06:54:17

标签: django python-3.x

我有一个节点对象:

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以执行相同操作。 提前谢谢!

2 个答案:

答案 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应用程序的交互性通常容易受到攻击。这就是为什么在许多广泛使用的应用程序/软件包(例如DjangoCelery)中,它作为默认设置被删除,只作为选项保留。

答案 1 :(得分:0)

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

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