【问题标题】:'NoneType' object has no attribute 'autodiscover_tasks' if run Django with Gunicorn如果使用 Gunicorn 运行 Django,则“NoneType”对象没有属性“autodiscover_tasks”
【发布时间】:2019-01-21 15:00:25
【问题描述】:

我有一个像这样的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 应用程序。

后端在 bash 文件中使用 CMD 运行:

/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 访问定期任务时显示错误。

【问题讨论】:

    标签: django celery gunicorn celerybeat


    【解决方案1】:

    我意识到,当我运行 python manage.py runserver 时,manage.py 中有一行设置了 DJANGO_SETTINGS_MODULE,但如果我使用 gunicorn 运行,则不会为 celery 填充此环境变量。

    我在backend 容器中设置了环境,一切正常!

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

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 2014-10-24
      • 2016-04-23
      相关资源
      最近更新 更多