Django:意外的持久模块变量

时间:2010-01-12 16:08:33

标签: python django

我今天注意到一个奇怪的行为:在下面的示例中,似乎config.CLIENT变量在请求中保持持久性 - 即使视图传递的是完全不同的client_key,获取客户端的查询也只执行一次(根据许多请求),然后config.CLIENT变量保持分配。

它似乎不是数据库缓存问题。

使用mod_python以及测试服务器(重新启动测试服务器时重新分配变量)。

我在这里缺少什么?

#views.py
from my_app import config

def get_client(client_key=None):
    if config.CLIENT == None:
        config.CLIENT = get_object_or_404(Client, key__exact=client_key, is_active__exact=True)
    return config.CLIENT

def some_view(request, client_key):
    client = get_client(client_key)
    ...
    return some_response

# config.py
CLIENT = None

2 个答案:

答案 0 :(得分:6)

多个请求由同一个进程处理,而像CLIENT这样的全局变量会像流程那样生存。在处理请求时,您不应该依赖全局变量 - 当您需要在构建响应时保留变量或将数据放入数据库时​​,使用本地变量时,必须在多个请求中保留某些变量。

如果您需要通过请求保留一些值,您可以将其添加到线程本地(here you should some examples, that adds user info to locals)或者只是将其作为变量传递给其他函数。

答案 1 :(得分:0)

好的,只是为了让它更清晰(并且响应Felix的评论),我发布的代码可以满足我的需求。整个问题产生于我自己的根本误解,对于我可能造成的任何混淆,我感到很遗憾。

import config

# This will be called once per request/view
def init_client(client_key):
    config.CLIENT = get_object_or_404(Client, key__exact=client_key, is_active__exact=True)

# This might be called from other modules that are unaware of requests, views etc 
def get_client():
    return config.CLIENT
相关问题