Per*_*man 10 python django pickle
我正在尝试挑选一个请求对象,以便我可以在有效输入的调试器中运行我的视图代码.但是,我得到了
Can't pickle 'lock' object: <thread.lock object at 0x93ad240>
Run Code Online (Sandbox Code Playgroud)
我查看了请求对象,但无法在其中的任何位置找到thread.lock对象.有谁知道它在哪里?有没有更好的方法来解决这个问题?
通常,您不能为任何Web服务器挑选HTTP请求对象.酸洗过程不会对物体本身进行腌制,而是对其所有参考物进行腌制.
通常的Web服务器设计模式是让每个HTTP请求都运行自己的线程.线程和HTTP请求之间必须存在连接.因此,HTTP对象与Web服务器的生命周期相关联,并且不能从Web服务器上下文中取出.
您可能想要做的是挑选HTTP请求对象的内容,并使用此内容作为有效负载重新创建请求.
好吧,对于那些感兴趣的人,我设法腌制HttpRequest和WSGIRequest反对.首先,你需要猴子补丁至少一个班,WSGIRequest(可能HttpRequest),从而可以显示一个__reduce__(self)方法.你会喜欢这样的:
WSGIRequest.__reduce__= __reduce__
Run Code Online (Sandbox Code Playgroud)
该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})
Run Code Online (Sandbox Code Playgroud)
METACOPY你要保留的密钥列表在哪里,例如.[ 'REMOTE_ADDR']
我发现它比有效载荷方法更容易和更透明(我之前使用的是芹菜).
| 归档时间: |
|
| 查看次数: |
5685 次 |
| 最近记录: |