Django Middleware上下文处理与变量域相关的问题

时间:2013-07-17 15:17:49

标签: python django middleware

在尝试为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

常见的获取方法:

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

谢谢!

2 个答案:

答案 0 :(得分:0)

在第一个示例中,您没有类属性_LOCALS,它是实例属性。因此,在第一种情况下ContextHandler._LOCALSNone,而cls中的get()ContextHandler

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

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

据我所知,类定义只处理一次(最有可能在主线程中)。我宁愿在_LOCALS初始化process_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)

答案 1 :(得分:0)

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