2011-08-20 48 views
3

我只是想知道Django是否被設計成一個完整的無狀態框架?Django無狀態?

它似乎鼓勵無狀態和外部存儲機制(數據庫和緩存),但我想知道是否有可能在服務器的內存中存儲一​​些東西,而我的應用程序正在開發並通過manage.py runserver運行。

回答

2

確定這是可能的。但是如果你正在編寫一個Web應用程序,你可能不會想要這樣做,因爲線程問題。

1

這取決於你的意思是「將東西存儲在服務器的內存中」。這也取決於數據的類型。如果可以,最好將「全局數據」存儲在數據庫或某處的文件系統中。除非需要每個請求將它存儲在Django實例本身中並沒有什麼意義。您需要實現某種形式的鎖定以防止競爭條件,但是如果您仍然將所有內容都存儲在服務器對象中,則需要擔心競爭條件。

當然,如果您正在討論按用戶分類的數據,Django確實支持sessions。或者,如果你願意讓用戶保存數據,這是另一個非常好的選擇,cookies

0

在每個用戶的基礎上在django應用程序中維護狀態的最佳方法是request.session(請參閱django sessions),這是一個可用於記憶有關當前用戶的事物的字典。

整個應用程序的狀態,你應該使用會話持久性數據存儲(數據庫或鍵/值存儲)

例如觀點:

def my_view(request): 
    pages_viewed = request.session.get('pages_viewed', 1) + 1 
    request.session['pages_viewed'] = pages_viewed 

    ... 

如果你想保持每對局部變量應用實例基礎上你可以定義像這樣

# number of times my_view has been served since by this server 
# instance since the last restart 
served_since_restart = 0 

def my_view(request): 
    served_since_restart += 1 
    ... 

模塊級變量如果你想保持在所有的應用服務器的一些服務器狀態(如總NUM您可能應該使用持久性鍵/值存儲,如redis,memcachedb或riak。這裏有所有這些選項的體面的比較:http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

你可以用redis(通過redis-py)這樣做(假設你的redis服務器在「127.0.0.1」(本地主機),它的端口6379(默認):

import redis 

def my_view(request): 
    r = redis.Redis(host='127.0.0.1', port="6379") 
    served = r.get('pages_served_all_time', 0) 
    served += 1 
    r.set('pages_served_all_time', served) 
    ... 
0

有,在處理存儲數據LocMemCache緩存後端,您可以用會話(但非常小心使用它:這個緩存是不是跨進程,所以你將不得不使用部署單個進程因爲不能保證隨後的請求將被其他進程處理)。全局變量也可以工作(如果不應該爲所有進程共享,則使用線程池) ess線程;關於跨進程通信的警告也適用於此)。

順便說一句,外部存儲有什麼問題?外部存儲提供了簡單的跨進程數據共享和其他功能(如緩存或數據庫持久性的內存限制算法)。