我只是想知道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线程;关于跨进程通信的警告也适用于此)。
顺便说一句,外部存储有什么问题?外部存储提供了简单的跨进程数据共享和其他功能(如缓存或数据库持久性的内存限制算法)。