0

自分のサイトのすべてのテキストを、Javascriptコードで使用する辞書としてdjango経由で送信しています。また、いくつかの値をdjangoで直接植えています。

a = gui_texts

このコード

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

そしてこのコード

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

異なる結果を生成します。最初のものは大丈夫です。2つ目は、ページを更新するたびに辞書が再帰的に内部に表示される結果になります(ブラウザが処理するにはすぐに大きくなりすぎます)。

これはdjangoラインです:

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

そしてこれはjavascriptです:

texts = {{entireText|safe}};

私にとってそれは非常に奇妙で、何が起こっているのか知りたいです。django関数やsimplejson.dumpsで使用されるキャッシュはありますか?

4

2 に答える 2

2

gui_textsa を 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": "{}"}'}

を作成する場合は、それ自体にa = gui_texts追加しないでください。gui_texts

json ダンプの前に wholeText を {} に設定すると、再帰が中断されますが、それでも回避する必要があります。gui_texts をそれ自体に追加すると、以前のシリアライゼーションではなく、空の dict に wholeText がリセットされたため、テキストが大きくなりません。

>>> 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": {}}'}

a = gui_texts.copy()gui_texts がコードから来て、それを表示する前に変更したい場合のように、おそらく gui_texts のコピーを作成したいと思うでしょう。

モジュール変数はすべてのスレッド間で共有され、スレッドローカルのみがスレッドに対してローカルです。ページリクエストごとにすべてのインポートなどで新しいインタープリターを開始することはありません。これらを変更する機能は非常に強力ですが、何が起こっているのかを完全に理解していないと、時々困ることがあります。

于 2012-07-04T12:01:20.337 に答える
0

HttpResponse を使用して値を返してみてください

サンプルコードは

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