在尝试为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)
谢谢!
答案 0 :(得分:0)
在第一个示例中,您没有类属性_LOCALS
,它是实例属性。因此,在第一种情况下ContextHandler._LOCALS
为None
,而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。