【问题标题】:Django: Unexpectedly persistent module variablesDjango:意外持久的模块变量
【发布时间】:2010-01-12 16:08:33
【问题描述】:

我今天注意到一个奇怪的行为:在下面的示例中,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

【问题讨论】:

  • 你为什么希望模块被 mod_python“重置”?
  • “请看下面”?什么?请使用其他信息更新您的问题,以便其他有类似问题的人得到帮助。
  • “请在下面查看我的评论”,关于 gruszczy 的回答,关于 为什么 我期待这个:“我期待这个,因为我来自 PHP(duh ),其中变量将在请求结束时被销毁。"

标签: python django


【解决方案1】:

多个请求由同一个进程处理,并且像 CLIENT 这样的全局变量与进程一样长。在处理请求时,您不应该依赖全局变量 - 当您需要在构建响应时保留一个变量或将数据放入数据库时​​,当某些内容必须跨多个请求持续存在时,请使用本地变量。

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

【讨论】:

  • 我明白了。我想我期待这个“重置”,因为我来自 PHP(duh),变量将在请求结束时被销毁。只要请求持续,我就会尝试在配置模块中“缓存”变量,因为我在其他地方(view.py 之外)需要它——我在客户端对象和其他代码中保留一个语言标志,否则查看-agnostic,如果可用,应该使用该标志。什么是更好的设计?在会话中保留它?传递请求?
  • 谢谢,您的回答教会了我一些关于 Python (Django) 的重要知识。当我意识到我实际上犯了一个根本性错误时,我正要实现线程局部变量,这可以更容易地解决:get_client() 在视图开始时调用一次,它不需要缓存客户端对象.然后这个对象对其他模块可用——正是我所需要的。
  • 澄清一下:def init_client(client_key=None): client = get_object_or_404(Client, key__exact=client_key, is_active__exact=True) config.CLIENT = client return config.CLIENT
【解决方案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

【讨论】:

    猜你喜欢
    • 2011-11-02
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多