【问题标题】:Django Middleware context handling issue related to variable domain与变量域相关的 Django 中间件上下文处理问题
【发布时间】:2013-07-17 15:17:48
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: python django middleware


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 您好,您的建议在 Django 中不起作用。如果您尝试从 API(随后调用)访问 COntextRequest,您将不会获得 _locals,因为它是为实例定义的,它将是一个新的。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-04-17
      • 1970-01-01
      • 2011-08-17
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多