2012-08-14 87 views
5

我正在實現一個非常輕量級的Web項目,它只有一個頁面,在圖表中顯示數據。我使用Django作爲Web服務器,並使用d3.js作爲此圖的繪圖例程。正如你可以想象的那樣,Django服務器只有幾個簡單的時間序列,所以我想知道我是否可以在RAM中保存這個變量。我的第一個試驗陽性,我在我的views.py是這樣的:django vars in ram

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

將它存儲在變量中確實具有線程影響(還有可擴展性 - 如果您有兩個運行相同應用程序的Django服務器?)。來自Django社區的建議是不要

這聽起來很適合Django緩存系統。只需緩存您的getGraph視圖@cache_page並完成工作。無需使用memcache,內置內存緩存緩存後端*將正常工作。在緩存(年)上放置一個非常高的數字作爲超時值。

這樣你就可以存儲HTTP響應(JSON)而不是X的值。但是從你的代碼示例來看,這不是問題。如果您需要重新計算X,你需要重新計算JSON,如果你需要重新計算JSON,您將需要重新計算X.

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


或者只是'內置內存後端',我忍不住

+0

作爲Django社區的成員,我不一定會說「不要」 - 我已經做了幾件非常類似的事情。但是,對於緩存後端而言,這是解決此問題的更好方法。 – 2012-08-14 11:26:48

+1

@Joe我試過了,它對正常的http請求工作正常,但是當我通過AJAX調用它時,它沒有被緩存。我猜,Django認爲每一個'AJAX'請求都與之前的不同,並再次計算'X'。如何處理?但是,再次感謝,推薦Django緩存系統 - 它似乎比全球變化更優雅 – 2012-08-14 13:16:10

+1

不介意!我通過使用'低級高速緩存API'解決了這個問題。這很完美。非常感謝 – 2012-08-14 13:27:11