我使用Django和Celery遇到了ModuleNotFound错误。我有一个使用django rest框架的post端点,它运行一个芹菜任务来解析和存储json。我可以很好地提供页面,但是当我发帖时,我收到以下错误:
Exception Type: ModuleNotFoundError at /app/v1/results
Exception Value: No module named 'djcelery'
起初我想也许我有版本问题,所以我检查了我的软件包,但我是最新的,没有看到任何突出的冲突。我确实看到djcelery是芹菜项目的加载器 init .py中的引用:
https://github.com/celery/celery/blob/master/celery/loaders/init.py
amqp (2.2.2)
billiard (3.5.0.3)
celery (4.1.0)
certifi (2018.1.18)
Django (2.0.3)
django-celery-results (1.0.1)
django-filter (1.1.0)
django-pyodbc-azure (2.0.3.0)
djangorestframework (3.7.7)
kombu (4.1.0)
Markdown (2.6.11)
mod-wsgi (4.6.2)
pip (9.0.1)
pyodbc (4.0.22)
pytz (2018.3)
setuptools (38.5.1)
vine (1.1.4)
wheel (0.30.0)
我的项目遵循Django第一步的核心http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html#django-first-steps:
Proj
- proj
- __init__.py
- celeryapp.py
- settings.py
- urls.py
- app
- models.py
- tasks.py
- views.py
- urls.py
- manage.py
对于我的所有代码,我从第一步教程开始,但是已经做了一些更改,遇到问题并查找帖子以及尝试找到相对于{{1}我可能导入错误的位置}。我还将NotFoundError
添加到项目中的所有文件中。
在我的from __future__ import absolute_import, unicode_literals
我有:
settings.py
在celeryapp.py(由于导入错误和其他帖子重命名为celery.py)我有:
# Celery settings
CELERY_BROKER_URL = 'amqp://user:pass@localhost:5672/proj_host'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_RESULT_BACKEND = 'django-db'
在from __future__ import absolute_import, unicode_literals
import os
from django import apps
from django.conf import settings
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
app = Celery('proj')
# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object(settings)
# Load task modules from all registered Django app configs.
app.autodiscover_tasks(lambda: [n.name for n in apps.get_app_configs()])
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}', format(self.request))
我有:
__init__.py
最后from __future__ import absolute_import, unicode_literals
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celeryapp import app as celery_app
__all__ = ['celery_app']
views.py
和from __future__ import absolute_import, unicode_literals
import json
from app.tasks import process_json_result
from rest_framework.views import APIView
from rest_framework.response import Response
class AppResultView(APIView):
#check for errors then
process_json_result.delay(json.dumps(request.data))
return Response({"success": True, "message": "Ok", "payload": ""})
tasks.py
错误的追溯时间越长:
from __future__ import absolute_import, unicode_literals
import json
import logging
from proj.celeryapp import app
from celery.utils.log import get_task_logger
from app.models import Result
logger = get_task_logger(__name__)
logger.setLevel(logging.DEBUG)
@app.task(name="app.tasks.process_json_result")
def process_json_result(result):
logger.info("Processing result")
py_result = json.loads(result)
# processing occurs
回溯上的路径从Apache / mod_wsgi anaconda环境路径看起来是正确的,我在我的anaconda虚拟环境中看到芹菜包文件,所以不确定什么没有被正确解析或者我的任务路径不是为芹菜设置恰到好处。
答案 0 :(得分:1)
今天早上回到问题并回滚所有更改,直到我排好了Django First步骤文档。那时我遇到了我见过其他人发帖的cannot import Celery from celery
问题。这让我想知道为什么这在django测试服务器上工作,但不在我的部署服务器上。然后我去查看Apache的httpd conf文件,找到了我认为可能导致问题的原因:
WSGIDaemonProcess proj python-path=/var/www/python:/var/www/python/proj:/home/alex/anaconda3/envs/clean_django/lib/python3.6/site-packages
我想知道我的项目是否在路径上的包之前导致问题,所以我将其更改为:
WSGIDaemonProcess proj python-path=//home/alex/anaconda3/envs/clean_django/lib/python3.6/site-packages:var/www/python:/var/www/python/proj
我的项目现在部署到Apache,Celery按预期运行。
TLDR检查您的路径以及django测试服务器和部署服务器上的路径解析之间的任何差异。确保软件包在您的应用程序之前,特别是在混合中使用Celery。