【问题标题】:Can't pickle : attribute lookup builtin.function failed不能腌制:属性查找 builtin.function 失败
【发布时间】:2013-04-18 19:57:56
【问题描述】:

我收到以下错误,该错误仅在我将delay 添加到process_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')

【问题讨论】:

    标签: python django django-celery


    【解决方案1】:

    您没有提供 ConfiguratorForm 的定义,但无论如何:异步执行要求您的任务的参数是可选择的,显然您的表单不是。你可能会走上艰难的道路,让它变得可挑剔,但这只是浪费时间。简单的解决方案是不传递表单,只传递表单的数据(iow:request.POST.copy() 但我不确定 Querydict 是否可以选择) - 或者更好的是,首先验证表单并只传递表单的 clean_data ,因为处理无效表单没有意义。

    【讨论】:

    • 不是 100% 确定你的意思,我想我有一些阅读要做。我确实尝试按照建议清理数据,但这只会给我一个错误'str' object has no attribute 'value'。
    • 用表格更新问题。
    • @Spike:如果你没有指定你是如何“尝试清理数据”或者你试图清理什么数据并且不要发布回溯(提示:回溯是你的朋友,最常见的不仅仅是阅读回溯就足以知道 - 或者至少做出有根据的猜测 - 出了什么问题)。这也是一个不同的问题,所以我们不要在这里尝试解决它。 wrt/ "pickable" 你可以阅读 Pickle 包的 (Python) 文档。
    猜你喜欢
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 2018-07-14
    • 2022-06-26
    • 1970-01-01
    • 2016-03-15
    相关资源
    最近更新 更多