2013-04-18 22 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)文檔。 –

相關問題