0

我通过 django 将我网站的所有文本作为 Javascript 代码使用的字典发送。我还直接用 django 植入了一些值。

a = gui_texts

这段代码

a['entireText'] = {}
a['entireText'] = json.dumps(gui_texts)

而这段代码

a['entireText'] = json.dumps(gui_texts)

产生不同的结果。第一个很好。每当我刷新页面时,第二个会导致字典在其内部递归出现(它很快变得太大而浏览器无法处理)。

这是 django 行:

self.response.out.write(template.render(path, a))

这是javascript:

texts = {{entireText|safe}};

对我来说这很奇怪,我想知道发生了什么。django 函数和/或 simplejson.dumps 是否使用了一些缓存?

4

2 回答 2

2

gui_texts通过将 a 设置为 gui_texts 然后对其进行修改来递归地添加自身。

>>> gui_texts = {}
>>> gui_texts
{}
>>> import json
>>> gui_texts['entireText'] = json.dumps(gui_texts)
>>> gui_texts
{'entireText': '{}'}
>>> gui_texts['entireText'] = json.dumps(gui_texts)
>>> gui_texts
{'entireText': '{"entireText": "{}"}'}

如果你 make a = gui_texts,不要添加gui_texts到 a/本身。

在 json 转储之前将整个文本设置为 {} 会破坏递归,但仍应避免。当您将 gui_texts 添加到自身时,您已将整个文本重置为空字典,而不是之前的序列化,这会阻止它增长。

>>> gui_texts = {}
>>> gui_texts['entireText'] = {}
>>> gui_texts
{'entireText': {}}
>>> gui_texts['entireText'] = json.dumps(gui_texts)
>>> gui_texts
{'entireText': '{"entireText": {}}'}
>>> gui_texts['entireText'] = {}
>>> gui_texts
{'entireText': {}}
>>> gui_texts['entireText'] = json.dumps(gui_texts)
>>> gui_texts
{'entireText': '{"entireText": {}}'}

您可能想要制作 gui_texts 的副本,例如 gui_textsa = gui_texts.copy()是否来自代码,并且您想在显示它之前进行修改

模块变量在所有线程之间共享,只有线程本地是线程本地的。您不会为每个页面请求启动一个包含所有导入等的新解释器。修改这些的能力可能非常强大,但如果您不完全了解正在发生的事情,有时可能会咬到您。

于 2012-07-04T12:01:20.337 回答
0

尝试使用 HttpResponse 返回值

示例代码将是

return HttpResponse(json.dumps(gui_texts), 'application/json')
于 2012-07-04T11:39:52.970 回答