2016-03-07 9 views
12

Sto cercando di aggiungere un'attività sedano seguendo First Steps With Django ma ottengo il seguente errore:RuntimeError: 'list' deve essere None o una lista, non <class 'str'> durante il tentativo di avviare lavoratore sedano

Traceback (most recent call last): 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/bin/celery", line 11, in <module> 
    sys.exit(main()) 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/__main__.py", line 30, in main 
    main() 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/bin/celery.py", line 81, in main 
    cmd.execute_from_commandline(argv) 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/bin/celery.py", line 770, in execute_from_commandline 
    super(CeleryCommand, self).execute_from_commandline(argv))) 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/bin/base.py", line 311, in execute_from_commandline 
    return self.handle_argv(self.prog_name, argv[1:]) 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/bin/celery.py", line 762, in handle_argv 
    return self.execute(command, argv) 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/bin/celery.py", line 694, in execute 
    ).run_from_argv(self.prog_name, argv[1:], command=argv[0]) 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/bin/worker.py", line 179, in run_from_argv 
    return self(*args, **options) 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/bin/base.py", line 274, in __call__ 
    ret = self.run(*args, **kwargs) 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/bin/worker.py", line 212, in run 
    state_db=self.node_format(state_db, hostname), **kwargs 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/worker/__init__.py", line 95, in __init__ 
    self.app.loader.init_worker() 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/loaders/base.py", line 128, in init_worker 
    self.import_default_modules() 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/loaders/base.py", line 116, in import_default_modules 
    signals.import_modules.send(sender=self.app) 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/utils/dispatch/signal.py", line 166, in send 
    response = receiver(signal=self, sender=sender, **named) 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/amqp/utils.py", line 42, in __call__ 
    self.set_error_state(exc) 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/amqp/utils.py", line 39, in __call__ 
    **dict(self.kwargs, **kwargs) if self.kwargs else kwargs 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/app/base.py", line 330, in _autodiscover_tasks 
    self.loader.autodiscover_tasks(packages, related_name) 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/loaders/base.py", line 252, in autodiscover_tasks 
    related_name) if mod) 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/loaders/base.py", line 273, in autodiscover_tasks 
    return [find_related_module(pkg, related_name) for pkg in packages] 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/loaders/base.py", line 273, in <listcomp> 
    return [find_related_module(pkg, related_name) for pkg in packages] 
    File "/Users/amrullahzunzunia/virtualenvs/flyrobe_new/lib/python3.5/site-packages/celery/loaders/base.py", line 295, in find_related_module 
    _imp.find_module(related_name, pkg_path) 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/imp.py", line 270, in find_module 
    "not {}".format(type(name))) 
RuntimeError: 'list' must be None or a list, not <class 'str'> 

Questo è la mia struttura del progetto:

  • progetto
    • config
      • impostazioni
        • base.py
        • local.py
        • production.py
      • celery.py # ha un'applicazione sedano
      • urls.py
      • wsgi.py
    • varie
      • models.py
      • views.py
      • tasks.py # ha un compito sedano

Questo è il mio config/celery.py:

from __future__ import absolute_import 
import os 
from celery import Celery 

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.local') 

from django.conf import settings 

app = Celery('config') 

app.config_from_object('django.conf:settings') 
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 


@app.task(bind=True) 
def debug_task(self): 
    print('Request: {0!r}'.format(self.request)) 

Questo è il mio config/settings/base.py:

THIRD_PARTY_APPS = [ 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django.contrib.postgres', 
    'django.contrib.gis', 
    'oauth2_provider', 
    'rest_framework', 
    'rest_framework_gis', 
    'import_export', 
    'braces', 
    'social.apps.django_app.default', 
    'rest_framework_social_oauth2', 
] 

CUSTOM_APPS = [ 
    'miscellaneous', 
    # more apps 
] 

INSTALLED_APPS = THIRD_PARTY_APPS + CUSTOM_APPS 

BROKER_URL = 'redis://localhost:6379' 
CELERY_RESULT_BACKEND = 'redis://localhost:6379' 
CELERY_ACCEPT_CONTENT = ['application/json'] 
CELERY_TASK_SERIALIZER = 'json' 
CELERY_RESULT_SERIALIZER = 'json' 
CELERY_TIMEZONE = 'Asia/Kolkata' 

Questo è il mio config/impostazioni/local.py:

from .base import * 
LOCAL_APPS = [ 
    'debug_toolbar', 
] 
INSTALLED_APPS.extend(LOCAL_APPS) 

Questo è il mio varie/tasks.py:

from celery import shared_task 

@shared_task 
def log_request_meta(request_meta): 
    # this is not complete yet 
    return {"a": "b"} 

Sto usando python-3.5 e 1.9 Django . Non riesco a capire cosa mi è mancato o dove mi sbaglio, perché ho fatto esattamente ciò che era nel tutorial di cui sopra.

Aggiornamento: versione sedano è 3.1.20

+0

La versione di sedano è 3.1.20 –

risposta

26

Ecco come ho risolto il problema:

ho visto che una delle mie applicazioni mancava __init__.py, che ha causato problemi con app.autodiscover_tasks(settings.INSTALLED_APPS)

ho aggiunto le manca __init__.py e il sedano lavoratore iniziato senza problemi

1

Il primo problema - credo che la linea dovrebbe essere effettivamente

app.autodiscover_tasks(settings.INSTALLED_APPS) 

Perché si utilizza un lambda?

Il secondo traceback - in miscellaneous/middleware.py si invoca un compito sedano che passa un oggetto wsgiref.util.FileWrapper - tuttavia si utilizza il serializzatore JSON che non può serializzare istanze di oggetti - è necessario utilizzare il serializzatore salamoia, invece.

Vedere la sezione pertinente nello docs.

+0

Ho usato lambda perché è stato menzionato nel tutorial di sedano (Primi passi con django). Ho provato a rimuovere quel lambda e ottengo lo stesso errore. Sto passando HttpRequest.META come parametro all'attività di sedici, che è un dict, dove sto passando un oggetto FileWrapper? –

+0

Mi sono reso conto che HttpRequest.META dict aveva alcuni valori che non erano tipi di dati primitivi, grazie per questo, (anche se non risolveva ancora il problema principale, ad esempio il lavoratore sedano non avviato) –

4

Questo errore viene generato dal Celery autodiscover_tasks quando non è possibile caricare uno dei tuoi INSTALLED_APPS per qualche motivo. Nel mio caso si trattava di una directory con il file tasks.py ma altri file app (models.py ecc.) Mancanti a causa di un commit Git incompleto.

+3

__init__.py mancava da uno delle app –

+0

Sì, lo stesso qui e risolto. – CARTOS

Problemi correlati