2013-04-18 16 views
6

我得到下面的错误,错误只发生在我添加delayprocess_upload函数,否则它工作没有问题。不能泡菜:属性查找内置函数失败

有人可以解释这个错误是什么,为什么发生这种情况以及解决任何建议?

错误:

PicklingError at /contacts/upload/configurator/47/ 
    Can't pickle <type 'function'>: attribute lookup __builtin__.function failed 

这是视图

if request.method == 'POST': 
     form = ConfiguratorForm(data=request.POST) 
     # Send import to task. 
     process_upload.delay(upload_id=upload.id, form=form) 

这是任务

@task 
def process_upload(upload_id, form): 
    upload = Upload.objects.get(id=upload_id) 
    upload.process(form=form) 

Upload.process是我的模型中:

def process(self, form): 
     self.date_start_processing = timezone.now() 
      import_this(data=self.filepath, extra_fields=[ 
       {'value': self.group_id, 'position': 5}, 
       {'value': self.uploaded_by.id, 'position': 6}], form=form) 

完整跟踪:

Traceback: 
File "/Users/user/Documents/workspace/sms/django-env/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    115.       response = callback(request, *callback_args, **callback_kwargs) 
File "/Users/user/Documents/workspace/sms/django-env/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 
    25.     return view_func(request, *args, **kwargs) 
File "/Users/user/Documents/workspace/sms/contacts/views.py" in upload_configurator 
    118.   process_upload.delay(upload_id=upload.id, form=form) 
File "/Users/user/Documents/workspace/sms/django-env/lib/python2.7/site-packages/celery/app/task.py" in delay 
    357.   return self.apply_async(args, kwargs) 
File "/Users/user/Documents/workspace/sms/django-env/lib/python2.7/site-packages/celery/app/task.py" in apply_async 
    472.          **options) 
File "/Users/user/Documents/workspace/sms/django-env/lib/python2.7/site-packages/celery/app/amqp.py" in publish_task 
    249.    **kwargs 
File "/Users/user/Documents/workspace/sms/django-env/lib/python2.7/site-packages/kombu/messaging.py" in publish 
    157.    compression, headers) 
File "/Users/user/Documents/workspace/sms/django-env/lib/python2.7/site-packages/kombu/messaging.py" in _prepare 
    233.    body) = encode(body, serializer=serializer) 
File "/Users/user/Documents/workspace/sms/django-env/lib/python2.7/site-packages/kombu/serialization.py" in encode 
    161.   payload = encoder(data) 
File "/Users/user/Documents/workspace/sms/django-env/lib/python2.7/site-packages/kombu/serialization.py" in dumps 
    340.   return dumper(obj, protocol=pickle_protocol) 

Exception Type: PicklingError at /contacts/upload/configurator/47/ 
Exception Value: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed 

forms.py

COL_CHOICES = [ 
    ('N/A', 'No Import'), 
    ('first_name', 'First Name'), 
    ('last_name', 'Last Name'), 
    ('company', 'Company'), 
    ('mobile', 'Mobile Number'), 
    ('email', 'Email Address'), 
    ] 


class ConfiguratorForm(forms.Form): 
    col1 = forms.TypedChoiceField(choices=COL_CHOICES, initial='first_name') 
    col2 = forms.TypedChoiceField(choices=COL_CHOICES, initial='first_name') 
    col3 = forms.TypedChoiceField(choices=COL_CHOICES, initial='first_name') 
    col4 = forms.TypedChoiceField(choices=COL_CHOICES, initial='first_name') 

回答

9

你不提供你ConfiguratorForm的定义,但不管怎么说:异步执行需要你的任务的参数是可选的,显然你的表单不是。你可能会走上艰难的路,并使其可以挑选,但这只是浪费时间。简单的解决方案是不传递表单,只传递表单的数据(iow:request.POST.copy(),但我不确定Querydict是否可以选择) - 或者更好,首先验证表单并且只传递表单的cleared_data因为处理无效表单没有意义。

+0

不是100%确定你的意思,我想我有一些阅读要做。我曾尝试清除数据,但是这只是给我一个错误'str'对象没有属性'值'。 – Prometheus

+0

用表单更新问题。 – Prometheus

+0

@Spike:如果你没有指定你如何做“尝试清理数据”,也不知道你试图清理什么数据,也不要发布回溯(提示:回溯是你的朋友,通常不只是读回溯足以知道 - 或者至少做出有教育的猜测 - 出了什么问题)。这也是一个不同的问题,所以我们不要在这里尝试解决它。 wrt /“pickable”你可以阅读Pickle包的(Python)文档。 –

相关问题