2014-12-20 6 views
8

Sto cercando di mettere alcuni oggetti python per lo più serializzabili json tranne datetime.datetime in coda di rabbitmq e quindi usare pickle per serializzare.Pickle rifiuta di serializzare il contenuto con il report di sedici ContentDisallowed: Rifiuto di deserializzare il contenuto non attendibile di tipo pickle

file di celery_config:

CELERY_TASK_SERIALIZER = 'pickle' 
CELERY_RESULT_SERIALIZER = 'pickle' 

Si sta gettando un detto un'eccezione:

File "/usr/local/lib/python2.7/dist-packages/kombu/serialization.py", line 174, in loads 
    raise self._for_untrusted_content(content_type, 'untrusted') 
ContentDisallowed: Refusing to deserialize untrusted content of type pickle (application/x-python-serialize) 

This link suggerisce che faccio un messaggio la firma di cui non ho idea.

Qualcuno può guidarmi attraverso come faccio a risolverlo?

+0

duplicato di http://stackoverflow.com/questions/6628016/how-to-disallow-pickle-serialization-in-celery? –

+0

Ehi Andy, ho controllato con la soluzione di cui sopra che non fa alcuna differenza. Sfortunatamente non sono in grado di commentare e porre i miei dubbi su di esso come sono nuovo per impilare. Btw top answer suggerisce di mettere serializzatore come json che non funzionerà nel mio caso. – andros1337

+0

fantastico! (o non eccezionale a seconda di come guardi le cose), il consiglio migliore per fare domande qui: dire le cose che hai provato e che cosa è successo (ad esempio questo non ha funzionato)! +1 per provarlo! –

risposta

15

Hai provato, questo:

CELERY_ACCEPT_CONTENT = ['pickle'] 

Come indicato in questo link (http://docs.celeryproject.org/en/latest/userguide/configuration.html#std:setting-accept_content) questa impostazione accetta un elenco di nomi serializzatore e tipi di contenuto, quindi si potrebbe o white-list il serializzatore o tipi di contenuto che ti aspetti di serializzare.

Quindi, fare quanto sopra, o usare la firma del messaggio SSL ... che è fondamentalmente, costruire una coppia di chiavi ssh e abilitare celery per usare le chiavi per ottenere una connessione sicura.

È possibile attivare il messaggio firma, registrando la "chiave" e "certificato" con:

CELERY_SECURITY_KEY = '/etc/ssl/private/worker.key' 
CELERY_SECURITY_CERTIFICATE = '/etc/ssl/certs/worker.pem' 
CELERY_SECURITY_CERT_STORE = '/etc/ssl/certs/*.pem' 
from celery.security import setup_security 
setup_security() 

Per quanto riguarda il significato di quella roba ... e come funziona, vedi: http://www.tldp.org/HOWTO/SSL-Certificates-HOWTO/x64.html

Inoltre, per sapere come generare le chiavi (e abilitare gli accessi non protetti da password), vedere: https://help.github.com/articles/generating-ssh-keys/ o http://mah.everybody.org/docs/ssh per i link più generali a cui si fa riferimento.

+0

Link per CELERY_ACCEPT_CONTENT aggiornato a questo: http://docs.celeryproject.org/en/latest/userguide/configuration.html#std:setting-accept_content –