我只是想知道Django是否被設計成一個完整的無狀態框架?Django無狀態?
它似乎鼓勵無狀態和外部存儲機制(數據庫和緩存),但我想知道是否有可能在服務器的內存中存儲一些東西,而我的應用程序正在開發並通過manage.py runserver
運行。
我只是想知道Django是否被設計成一個完整的無狀態框架?Django無狀態?
它似乎鼓勵無狀態和外部存儲機制(數據庫和緩存),但我想知道是否有可能在服務器的內存中存儲一些東西,而我的應用程序正在開發並通過manage.py runserver
運行。
確定這是可能的。但是如果你正在編寫一個Web應用程序,你可能不會想要這樣做,因爲線程問題。
在每個用戶的基礎上在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)
...
有,在處理存儲數據LocMemCache緩存後端,您可以用會話(但非常小心使用它:這個緩存是不是跨進程,所以你將不得不使用部署單個進程因爲不能保證隨後的請求將被其他進程處理)。全局變量也可以工作(如果不應該爲所有進程共享,則使用線程池) ess線程;關於跨進程通信的警告也適用於此)。
順便說一句,外部存儲有什麼問題?外部存儲提供了簡單的跨進程數據共享和其他功能(如緩存或數據庫持久性的內存限制算法)。