2011-08-20 69 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线程;关于跨进程通信的警告也适用于此)。

顺便说一句,外部存储有什么问题?外部存储提供了简单的跨进程数据共享和其他功能(如缓存或数据库持久性的内存限制算法)。