代码之家  ›  专栏  ›  技术社区  ›  Personman

酸洗django请求对象

  •  9
  • Personman  · 技术社区  · 14 年前

    我正在尝试pickle一个请求对象,以便能够在具有有效输入的调试器中运行视图代码。不过,我正在

    Can't pickle 'lock' object: <thread.lock object at 0x93ad240>
    

    我查看了请求对象,但在其中找不到thread.lock对象。有人知道它在哪里吗?有更好的方法吗?

    2 回复  |  直到 7 年前
        1
  •  6
  •   Mikko Ohtamaa    13 年前

    通常,不能为任何Web服务器pickle HTTP请求对象。酸洗过程不会对对象本身进行酸洗,而是对其所有引用进行酸洗。

    通常的Web服务器设计模式是让每个HTTP请求运行自己的线程。线程和HTTP请求之间必须存在连接。因此,HTTP对象绑定到Web服务器的生命周期,不能从Web服务器上下文中取出。

    您可能想要做的是pickle HTTP请求对象的内容,并使用此内容作为有效负载重新创建请求。

        2
  •  6
  •   Personman    7 年前

    好吧,对于那些感兴趣的人,我已经设法腌制了 HttpRequest WSGIRequest 物体。 首先,你至少需要修一门课, WSGI请求 (可能) HTTP预告 ,这样它就暴露了 __reduce__(self) 方法。您希望:

    WSGIRequest.__reduce__= __reduce__
    

    这个 reduce 方法可能如下所示:

    def __reduce__(self):
        meta = dict([(k,self.META[k]) for k in METACOPY if k in self.META and isinstance(self.META[k], str)])
        return (HttpRequest, (), {'META':meta, 'POST':self.POST, 'GET':self.GET, 'user':self.user, 'path':self.path})
    

    哪里 METACOPY 是您要保留的密钥列表,例如['remote_addr']

    我发现它比有效载荷法(我以前用过芹菜)更方便、更透明。