酸洗Django请求对象

时间:2010-06-23 16:40:11

标签: python django pickle

我正在尝试挑选一个请求对象,以便我可以在具有有效输入的调试器中运行我的视图代码。但是,我正在

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

我查看了请求对象,但无法在其中的任何位置找到thread.lock对象。有谁知道它在哪里?有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:6)

通常,您无法为任何Web服务器挑选HTTP请求对象。酸洗过程不会对物体本身进行腌制,而是对其所有参考物进行腌制。

通常的Web服务器设计模式是让每个HTTP请求都运行自己的线程。线程和HTTP请求之间必须存在连接。因此,HTTP对象与Web服务器的生命周期相关联,无法从Web服务器上下文中删除。

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

答案 1 :(得分:6)

好的,对于那些感兴趣的人,我设法挑选了HttpRequestWSGIRequest个对象。 首先,您需要至少修补一个类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)更方便,更透明。