2012-08-14 3 views
5

私は実際に軽量のWebプロジェクトを実装しています。これは1ページしかなく、図にデータを表示しています。私はWebサーバーとしてDjangoを使用し、この図のプロットルーチンとしてd3.jsを使用します。あなたが想像することができるように、Djangoサーバが応答しなければならない単純な時系列がいくつかありますので、私はこの変数をramに保持することができないのだろうかと思いました。私の最初のテストは、私は私のviews.pyにこのようなものを持っていた、陽性であった:ram内のdjango vars

X = np.array([123,23,1,32,123,1]) 

@csrf_exempt 
def getGraph(request): 
    global X 
    return HttpResponse(json.dumps(X)) 

お知らせ、Xは、すべての今して、別の関数によって更新されますが、すべてのユーザのアクセスは読み取り専用です。私は対処する必要があります

  1. グローバル変数を定義することによってセキュリティの問題はありますか?
  2. 一般的に不一致?

a threadは、Djangoのグローバル変数について議論していますが、その場合、複数の書き込みアクセスを処理するのが難しいです。

私はXに入っているすべてのデータが既に巨大なリモートデータベースに保存されており、このWebアプリケーションはデータを表示するだけで済みます。

答えて

2

これを変数に格納することは、実際にスレッドに影響を及ぼします(また、同じアプリケーションを実行する2つのDjangoサーバがある場合はスケーラビリティ)。 Djangoコミュニティからのアドバイスはではありません

これはDjangoキャッシュシステムに適しています。ちょうどあなたのgetGraphのキャッシュを@cache_pageでキャッシュしてください。 memcacheを使用する必要はありません。組み込みのインメモリメモリキャッシュキャッシュバックエンド*は正常に動作します。キャッシュ(タイムアウト)として非常に高い数値をキャッシュに格納します。

この方法では、Xの値ではなくHTTP応答(JSON)を保存しますが、コードサンプルからは問題ありません。あなたはX-計算の再する必要がある場合は、JSONを再計算する必要がある、とあなたはJSONを再計算する必要がある場合は、X.

https://docs.djangoproject.com/en/dev/topics/cache/?from=olddocs/


1-計算し直す必要がありますまたはちょうど「内蔵メモリバックエンド」、私は抵抗することができません

+0

Djangoコミュニティの一員として、私は必ずしも「しない」とは言えません。しかし、キャッシュバックエンドの+1は、この問題を解決するもっと良い方法です。 –

+1

@Joeこれを試してみましたが、通常のhttpリクエストでうまく動作しますが、 'AJAX'で呼び出すとキャッシュされません。私は、Djangoはすべての単一の 'AJAX'要求が前のものと異なっているとみなし、' X'を再度計算します。それに対処する方法?しかし、おかげで、再びDjangoのキャッシュシステムを推薦しました - それはグローバルバースよりもかなりエレガントであるようです –

+1

気にしないでください!私は 'The low-level cache API'を使って解決しました。それはちょうど完璧です。どうもありがとう –