Django:意外的持久化模块变量

2024-06-02 10:15:09 发布

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

今天我注意到一个奇怪的行为:在下面的示例中,似乎配置客户端变量保持持久的accross请求-即使视图被传递了一个完全不同的客户机密钥,获取客户机的查询只执行一次(每个多个请求),然后配置客户端变量保持指定状态。在

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

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

Tags: keypyclientnoneconfig客户端示例get
2条回答

好吧,为了让它更清楚一点(并对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

多个请求由同一个进程和全局变量(如客户端)处理,与process一样长。在处理请求时,您不应该依赖全局变量—当您需要在构建响应或将数据放入数据库时保留一个变量时,当某些内容必须在多个请求之间持久化时,请使用本地变量。在

如果需要在请求中保留一些值,可以将其添加到线程局部变量(here you should some examples, that adds user info to locals)中,也可以将其作为变量传递到其他函数中。在

相关问题 更多 >