Объект 'NoneType' не имеет атрибута 'autodiscover_tasks', если запустить Django с Gunicorn - PullRequest
0 голосов
/ 21 января 2019

У меня есть docker-compose файл, подобный этому:

backend:
    image: ${API_IMAGE}
    env_file:
      - .env
    depends_on:
      - db
    volumes:
      - ./data/server/static/:/usr/src/api/static
      - ./data/server/uploads/:/usr/src/api/uploads
    restart: always
frontend:
    image: ${FRONTEND_IMAGE}
    env_file:
      - .env
    ports:
    - "80:80"
    volumes:
    - ./data/server/logs:/usr/src/web/logs
    - ./configs/nginx:/etc/nginx/conf.d
    - ./data/server/static/:/usr/src/app/static
    - ./data/server/uploads/:/usr/src/app/uploads
    restart: always
celery:
    image: ${API_IMAGE}
    env_file:
      - .env
    working_dir: /usr/src/api/
    environment:
      DJANGO_SETTINGS_MODULE: 'core.settings'
    depends_on:
      - redis
    command: /bin/sh -c "celery -E -A core worker -l info"

  beat:
    image: ${API_IMAGE}
    env_file:
      - .env
    working_dir: /usr/src/api/
    environment:
      DJANGO_SETTINGS_MODULE: 'core.settings'
    depends_on:
      - celery
    command: /bin/sh -c "celery -A core beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler"

Все доступно через контейнер frontend, который является приложением Nginx и использует прокси для отправки запроса в другие контейнеры.

Бэкэнд работает с CMD в файле bash с:

/usr/local/bin/gunicorn --access-logfile - -w 4 core.wsgi:application -b 0.0.0.0:80 &

Все нормально и работает. Но если я захожу на сайт администратора и пытаюсь использовать Celery Beat для создания периодической задачи, покажите мне эту ошибку:

Traceback (most recent call last):
backend_1  |   File "/usr/local/lib/python3.6/site-packages/kombu/utils/objects.py", line 42, in __get__
backend_1  |     return obj.__dict__[self.__name__]
backend_1  | KeyError: '_modules'
backend_1  | 
backend_1  | During handling of the above exception, another exception occurred:

...

File "/usr/local/lib/python3.6/site-packages/celery/app/base.py", line 684, in <listcomp>
backend_1  |     for pkg in fixup.autodiscover_tasks()
backend_1  | AttributeError: 'NoneType' object has no attribute 'autodiscover_tasks'

Но, если я запускаю backend с:

python manage.py runserver 80

Нет проблем, нет исключений. Все хорошо!

Когда я бегу с gunicorn, показывать ошибку при попытке доступа к Периодическим Задачам из Celery Beat.

1 Ответ

0 голосов
/ 25 января 2019

Я понимаю, что когда я запускаю python manage.py runserver, в manage.py есть строка, которая устанавливает DJANGO_SETTINGS_MODULE, но если я запускаю с gunicorn, эта переменная окружения не заполняется для сельдерея, работает нормально.

Я установил среду в backend контейнере, и все работает!

.
.
.
backend:
  environment:
    DJANGO_SETTINGS_MODULE: 'core.settings'
.
.
.
...