django将locals()传递给芹菜任务

时间:2012-09-06 07:32:30

标签: django exception celery locals

我正在使用python 2.7和django 1.27,我正在使用芹菜来完成任务。

我有这个观点

def my_view(request):
    do_stuff()
    local_1 = 1
    local_2 = 4
    celery_delayed_task(locals())
    return HttpResponse('OK')

这导致了这种情况

  

传递locals()失败:无法定义 getstate 定义广告位的类

所以我想也许我需要创建一个locals()字典的副本,因为当视图不再存在时将调用该任务。

我试试这个:

def my_view(request):
    do_stuff()
    local_1 = 1
    local_2 = 4
    locals_dict = copy.deepcopy(locals())
    celery_delayed_task(locals_dict)
    return HttpResponse('OK')

现在我收到了这个错误:

  

对象的Deepcopy失败:object。 new (cStringIO.StringO)不安全,请使用cStringIO.StringO。 new ()

显然,我做错了,有什么想法吗?

1 个答案:

答案 0 :(得分:1)

必须序列化任务参数。

Celery默认使用Python pickle协议,但也支持json,yaml,msgpack或自定义序列化程序。

您尝试发送的对象无法进行腌制。你有可能让它们成为可选择的,但最终 - 作为任务参数传递当地人并不是一个好习惯。

请参阅:http://docs.python.org/library/pickle.html

相关问题