Django:每个请求单身?

时间:2011-06-04 01:06:32

标签: django

我们有一个围绕suds(SOAP)请求的包装器,我们在整个应用程序中都这样使用:

from app.wrapper import ByDesign
bd = ByDesign()

不幸的是,这个实例化是在每个请求的几个点上进行的,导致suds重新下载WSDL文件,我想我们可以通过让bd = ByDesign()返回一个单例来节省一些时间。

由于suds不是线程安全的,因此每个请求必须是一个单身。

唯一的问题是,我想这样做,所以我不必更改除app.wrapper.ByDesign类之外的任何代码,这样我就不必更改任何调用它的代码。如果没有'每个请求的单身人士'要求,我会做这样的事情:

class ByDesignRenamed(object):
    pass

_BD_INSTANCE = None
def ByDesign():
    global _BD_INSTANCE
    if not _BD_INSTANCE:
       _BD_INSTANCE = ByDesignRenamed()
    return _BD_INSTANCE

但是,这在线程服务器环境中不起作用。对我有什么想法吗?

1 个答案:

答案 0 :(得分:9)

查看threading.local(),它介于纯粹邪恶之间,是实现目标的唯一途径。应该是这样的:

import threading

_local = threading.local()

def ByDesign():
    if 'bd' not in _local.__dict__:
       _local.bd = ByDesignRenamed()
    return _local.bd

进一步阅读: