我只是想知道Django是否被设计成一个完全无状态框架?
它似乎鼓励无状态和外部存储机制(数据库和缓存),但我想知道是否有可能在我的应用程序处于开发状态并通过manage.py runserver
运行时将一些内容存储在服务器的内存中。 / p>
答案 0 :(得分:2)
当然有可能。但是,如果您正在编写Web应用程序,则可能由于线程问题而不希望这样做。
答案 1 :(得分:1)
这取决于“将内容存储在服务器内存中”的含义。它还取决于数据类型。如果可以的话,最好将“全局数据”存储在数据库或文件系统中。除非需要每个请求,否则将它存储在Django实例本身中并没有意义。您需要实现某种形式的锁定以防止竞争条件,但如果您将所有内容存储在服务器对象上,则需要担心竞争条件。
当然,如果您正在讨论逐个用户数据,Django确实支持sessions。或者,如果您愿意让用户保存数据cookies,这是另一个非常好的选择。
答案 2 :(得分:0)
在每个用户的基础上在django app中维护状态的最佳方法是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
...
如果您想在所有应用服务器上保持某种服务器状态(例如,查看的总页数 EVER ),您应该使用像redis,memcachedb或riak这样的持久性键/值存储。这里有所有这些选项的比较:http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis
您可以使用redis(通过redis-py)这样做(假设您的redis服务器位于“127.0.0.1”(localhost),它的端口是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)
...
答案 3 :(得分:0)
存在LocMemCache缓存后端,用于存储进程中的数据。您可以将它与会话一起使用(但要非常小心:此缓存不是跨进程的,因此您必须使用单个进程进行部署,因为无法保证后续请求将由相同的进程处理)。全局变量也可以工作(如果不应该为所有进程线程共享它们,则使用threadlocals;有关跨进程通信的警告也适用于此处)。
顺便问一下,外部存储有什么问题?外部存储提供简单的跨进程数据共享和其他功能(如缓存的内存限制算法或数据库的持久性)。