2013-04-18 14 views
6

Viene visualizzato l'errore di seguito, l'errore si verifica solo quando aggiungo la funzione delay a process_upload, altrimenti funziona senza problemi.Impossibile pickle: attributo lookup builtin.function non riuscito

Qualcuno potrebbe spiegare cos'è questo errore, perché si sta verificando e quali sono le raccomandazioni da risolvere?

Errore:

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

Questa è la vista

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

Questo è il compito

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

Upload.process è dentro il mio modello:

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) 

traccia completa:

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') 

risposta

9

Non fornisci definizione del ConfiguratorForm ma in ogni caso : l'esecuzione asincrona richiede che gli argomenti del tuo compito siano selezionabili, e ovviamente il tuo modulo non lo è. Potresti andare nel modo più duro e renderlo selezionabile, ma è solo una perdita di tempo. La soluzione semplice è non passare il modulo, solo passare i dati del modulo (iow: request.POST.copy() ma non sono sicuro che Querydict sia selezionabile) - o meglio, prima convalidare il modulo e solo passare il clean_data del modulo , in quanto non ha senso elaborare un modulo non valido.

+0

Non sicuro al 100% cosa intendi, penso di avere un po 'di lettura da fare. Ho provato a pulire i dati come suggerito ma mi dà solo un errore. L'oggetto 'str' non ha attributo 'valore'. – Prometheus

+0

Domanda di aggiornamento con modulo. – Prometheus

+0

@Spike: se non specifichi come hai fatto "prova a pulire i dati" né quali dati hai provato a pulire e non postare il traceback (suggerimento: i traceback sono tuoi amici, il più delle volte semplicemente leggendo il traceback è abbastanza da sapere - o almeno fare un'ipotesi plausibile - cosa è andato storto). Anche questo è un problema diverso, quindi non proviamo a risolverlo qui. wrt/"selezionabile" è possibile leggere la documentazione (Python) per il pacchetto Pickle. –

Problemi correlati