Django无国籍状态?

2024-10-03 13:27:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是想知道Django是否被设计成一个完全无状态的框架?在

它似乎鼓励无状态和外部存储机制(数据库和缓存),但我想知道,当我的应用程序处于develpoment并通过manage.py runserver运行时,是否可以在服务器内存中存储一些内容。在


Tags: django内存py服务器框架数据库应用程序内容
3条回答

当然有可能。但是如果您正在编写一个web应用程序,您可能不会因为线程问题而这样做。在

这取决于你所说的“在服务器内存中存储内容”的含义,也取决于数据的类型。如果可以,最好将“全局数据”存储在数据库或某个文件系统中。除非每个请求都需要,否则将其存储在Django实例本身是没有意义的。您将需要实现某种形式的锁定以防止争用条件,但是如果您将所有内容都存储在服务器对象上,则需要担心争用条件。在

当然,如果您谈论的是逐个用户的数据,Django确实支持sessions。或者,如果您愿意让用户保存数据,cookies,这是另一个非常好的选择。在

在django应用程序中按用户维护状态的最佳方法是request.session(请参见django sessions),这是一个可以用来记住当前用户信息的字典。在

对于应用程序范围的状态,应该使用持久数据存储(数据库或键/值存储)

会话的示例视图:

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

    ...

如果你想在每个应用实例的基础上维护局部变量,你可以定义模块级的变量

^{2}$

如果您想在所有应用服务器上保持某种服务器状态(比如查看的总页数曾经),您可能应该使用一个持久的键/值存储,如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)
    ...

相关问题 更多 >