Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:意外地持久化模块变量_Python_Django - Fatal编程技术网

Python Django:意外地持久化模块变量

Python Django:意外地持久化模块变量,python,django,Python,Django,今天我注意到一个奇怪的行为:在下面的示例中,config.CLIENT变量似乎保持持久的accross请求–即使视图传递了一个完全不同的CLIENT_键,获取客户端的查询只执行一次(每多个请求一次),然后config.CLIENT变量保持分配状态 这似乎不是一个数据库缓存问题 它发生在mod_python和测试服务器上(当测试服务器重新启动时,变量被重新分配) 我错过了什么 #views.py from my_app import config def get_client(client_ke

今天我注意到一个奇怪的行为:在下面的示例中,config.CLIENT变量似乎保持持久的accross请求–即使视图传递了一个完全不同的CLIENT_键,获取客户端的查询只执行一次(每多个请求一次),然后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

多个请求由同一个进程处理,全局变量(如您的客户机)和进程一样可以生存多久。在处理请求时,您不应该依赖全局变量——当您需要在构建响应时保留一个变量或将数据放入数据库时,当某些内容必须跨多个请求持久化时,请使用局部变量


如果您需要在请求中保留一些值,您可以将其添加到线程局部变量中,也可以将其作为变量传递到其他函数中。

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


如果您需要在请求中保留一些值,您可以将其添加到线程局部变量中,也可以将其作为变量传递到其他函数中。

好的,只是为了让它更清楚一点(并回应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

好的,为了让它更清楚一点(并且回应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

为什么您希望mod_python“重置”模块?“请参见下文”?什么?请用其他信息更新您的问题,以便其他有类似问题的人能够得到帮助。“请参阅我下面的评论”,关于gruszczy的回答,关于我为什么期待这个:“我期待这个,因为我来自PHP(duh),在请求结束时,变量将被销毁。”为什么您希望mod_python“重置”模块?“请参见下文”?什么?请用其他信息更新您的问题,以便其他有类似问题的人能够得到帮助。“请参阅我下面的评论”,关于gruszczy的回答,关于我为什么期待这个:“我期待这个,因为我来自PHP(duh),在请求结束时变量将被销毁。”我明白了。我想我期待这个“重置”,因为我来自PHP(duh),在那里变量将在请求结束时被销毁。我试图在配置模块中“缓存”变量,直到请求持续,因为我在其他地方需要它(在view.py之外)——我在客户机对象中保留一个语言标志,其他一些代码,否则视图不可知,应该使用该标志(如果可用)。什么是更好的设计?把它留在会议上?传递请求?谢谢,您的回答教会了我一些关于Python(Django)的重要知识。我正要实现线程局部变量,这时我意识到我实际上犯了一个根本性的错误,这可以更容易地解决:get_client()在视图开始时被调用一次,它不需要缓存客户端对象。然后这个对象可用于其他模块——这正是我所需要的。为了澄清:def init_client(client_key=None):client=get_object_或_404(client,key_uexact=client_key,is_active_uexact=True)config.client=client return config.CLIENTI请参阅。我想我期待这个“重置”,因为我来自PHP(duh),在那里变量将在请求结束时被销毁。我试图在配置模块中“缓存”变量,直到请求持续,因为我在其他地方需要它(在view.py之外)——我在客户机对象中保留一个语言标志,其他一些代码,否则视图不可知,应该使用该标志(如果可用)。什么是更好的设计?把它留在会议上?传递请求?谢谢,您的回答教会了我一些关于Python(Django)的重要知识。我正要实现线程局部变量,这时我意识到我实际上犯了一个根本性的错误,这可以更容易地解决:get_client()在视图开始时被调用一次,它不需要缓存客户端对象。然后这个对象可用于其他模块——这正是我所需要的。为了澄清:def init_client(client_key=None):client=get_object_或_404(client,key_uexact=client_key,is_active_uexact=True)config.client=client return config.client