0

在尝试为 django 定义一个将请求保留在线程上下文中的中间件时,我遇到了一个奇怪的变量域问题。当我尝试从视图文件中的 API 访问方法“get”时,第一个代码部分会产生错误。第二个代码示例效果很好。为什么???

示例 1(不起作用):

class ContextHandler(object):
    #_LOCALS = threading.local()

    def process_request(self, request):
        self._LOCALS = threading.local()
        self._LOCALS.x = "alon"
        return None

示例 2(作品):

class ContextHandler(object):
    _LOCALS = threading.local()

    def process_request(self, request):
        self._LOCALS.x = "alon"
        return None

常用get方法:

@classmethod
    def get(cls):
        return getattr(cls._LOCALS, 'x', None)

谢谢!

4

2 回答 2

0

在第一个示例中,您没有类属性_LOCALS,它是实例属性。所以在第一种情况下ContextHandler._LOCALSisNoneclsin get()is ContextHandler

如果您想要线程安全代码,请不要坚持使用@classmethodand

class ContextHandler(object):
    _LOCALS = threading.local()

据我所知,类定义只处理一次(很可能在主线程中)。我宁愿初始化_LOCALSprocess_request()制作get()实例方法:

class ContextHandler(object):

    def process_request(self, request):
        self._LOCALS = threading.local()
        self._LOCALS.x = "alon"
        return None

    def get(self):
        return getattr(self._LOCALS, 'x', None)
于 2013-07-17T15:35:35.513 回答
0

事实证明,如果类具有类/静态级别变量,则声明 self.someproperty 等于声明 .someproperty。

于 2013-07-18T12:48:27.720 回答