我正在尝试挑选一个请求对象,以便我可以在具有有效输入的调试器中运行我的视图代码。但是,我正在
Can't pickle 'lock' object: <thread.lock object at 0x93ad240>
我查看了请求对象,但无法在其中的任何位置找到thread.lock对象。有谁知道它在哪里?有没有更好的方法来解决这个问题?
答案 0 :(得分:6)
通常,您无法为任何Web服务器挑选HTTP请求对象。酸洗过程不会对物体本身进行腌制,而是对其所有参考物进行腌制。
通常的Web服务器设计模式是让每个HTTP请求都运行自己的线程。线程和HTTP请求之间必须存在连接。因此,HTTP对象与Web服务器的生命周期相关联,无法从Web服务器上下文中删除。
您可能想要做的是挑选HTTP请求对象的内容,并使用此内容作为有效负载重新创建请求。
答案 1 :(得分:6)
好的,对于那些感兴趣的人,我设法挑选了HttpRequest
和WSGIRequest
个对象。
首先,您需要至少修补一个类WSGIRequest
(可能还有HttpRequest
),以便它公开__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']
我发现它比有效载荷方法(我以前用过celery)更方便,更透明。