Skip to main content
 首页 » 编程设计

python之在我的 celery 应用程序中使用 django ORM 出现错误

2024年08月22日25youxin

我正在开发一个 celery 独立应用程序,它使用 Django ORM 访问我的数据库并在我的数据中执行操作。我遵循了这个问题的答案:Use Django ORM as standalone

但是当我运行我的 celery worker 时,它给了我以下错误:

django.core.exceptions.ImproperlyConfigured: Requested setting LOGGING_CONFIG, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

这是我的完整应用程序代码和目录结构:

standAlone/ 
----init.py 
----settings.py 
 
DATABASE_ENGINE    = "django.db.backends.mysql" 
DATABASE_NAME      = "my_database_name" 
DATABASE_USER      = "my_database_username" 
DATABASE_PASSWORD  = "my_database_password" 
DATABASE_HOST      = "my_host" 
DATABASE_PORT      = "3306", 
INSTALLED_APPS     = ("myApp") 
 
----manage.py 
 
#!/usr/bin/env python 
import os 
import sys 
 
if __name__ == "__main__": 
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myApp.settings") 
    try: 
        from django.core.management import execute_from_command_line 
    except ImportError: 
        # The above import may fail for some other reason. Ensure that the 
        # issue is really that Django is missing to avoid masking other 
        # exceptions on Python 2. 
        try: 
            import django 
        except ImportError: 
            raise ImportError( 
                "Couldn't import Django. Are you sure it's installed and " 
                "available on your PYTHONPATH environment variable? Did you " 
                "forget to activate a virtual environment?" 
            ) 
        raise 
    execute_from_command_line(sys.argv) 
 
----tasks.py 
 
import django 
django.setup() 
from celery import Celery 
from django.conf import settings 
settings.configure( 
    DATABASE_ENGINE    = "django.db.backends.mysql", 
    DATABASE_NAME      = "myDatabase", 
    DATABASE_USER      = "myUsername", 
    DATABASE_PASSWORD  = "myPassword", 
    DATABASE_HOST      = "my host", 
    DATABASE_PORT      = "3306", 
    INSTALLED_APPS     = ("myApp,") 
) 
from django.db import models 
from myApp.models import * 
 
 
 
app = Celery('tasks', broker='redis://ip_address') 
 
@app.task(name="task1")  
def task1(): 
    #my task code 
@app.task(name="task2")  
def task2(): 
    #my task code 
----/myApp 
--------/init.py 
--------/models.py 
from django.db import models  
from django.utils.encoding import python_2_unicode_compatible  
from django.utils import timezone  
 
# my models go here 

现在,当我运行以下命令时:

celery -A tasks worker & 

我收到这个错误:

django.core.exceptions.ImproperlyConfigured: Requested setting LOGGING_CONFIG, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings. 

谁能告诉我哪里出错了?

更新:

这是完整的回溯:

Traceback (most recent call last): 
  File "/usr/local/bin/celery", line 11, in <module> 
    sys.exit(main()) 
  File "/usr/local/lib/python2.7/dist-packages/celery/__main__.py", line 30, in main 
    main() 
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 81, in main 
    cmd.execute_from_commandline(argv) 
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 793, in execute_from_commandline 
    super(CeleryCommand, self).execute_from_commandline(argv))) 
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/base.py", line 309, in execute_from_commandline 
    argv = self.setup_app_from_commandline(argv) 
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/base.py", line 469, in setup_app_from_commandline 
    self.app = self.find_app(app) 
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/base.py", line 489, in find_app 
    return find_app(app, symbol_by_name=self.symbol_by_name) 
  File "/usr/local/lib/python2.7/dist-packages/celery/app/utils.py", line 235, in find_app 
    sym = symbol_by_name(app, imp=imp) 
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/base.py", line 492, in symbol_by_name 
    return symbol_by_name(name, imp=imp) 
  File "/usr/local/lib/python2.7/dist-packages/kombu/utils/__init__.py", line 96, in symbol_by_name 
    module = imp(module_name, package=package, **kwargs) 
  File "/usr/local/lib/python2.7/dist-packages/celery/utils/imports.py", line 101, in import_from_cwd 
    return imp(module, package=package) 
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
  File "/root/standAlone/tasks.py", line 2, in <module> 
    django.setup() 
  File "/usr/local/lib/python2.7/dist-packages/django/__init__.py", line 22, in setup 
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING) 
  File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 53, in __getattr__ 
    self._setup(name) 
  File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 39, in _setup 
    % (desc, ENVIRONMENT_VARIABLE)) 
django.core.exceptions.ImproperlyConfigured: Requested setting LOGGING_CONFIG, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings. 

更新 2:

现在我已经应用了所提供的答案,但出现错误提示

no module named m

具有以下追溯:

Traceback (most recent call last): 
  File "/usr/local/bin/celery", line 11, in <module> 
    sys.exit(main()) 
  File "/usr/local/lib/python2.7/dist-packages/celery/__main__.py", line 30, in main 
    main() 
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 81, in main 
    cmd.execute_from_commandline(argv) 
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 793, in execute_from_commandline 
    super(CeleryCommand, self).execute_from_commandline(argv))) 
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/base.py", line 309, in execute_from_commandline 
    argv = self.setup_app_from_commandline(argv) 
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/base.py", line 469, in setup_app_from_commandline 
    self.app = self.find_app(app) 
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/base.py", line 489, in find_app 
    return find_app(app, symbol_by_name=self.symbol_by_name) 
  File "/usr/local/lib/python2.7/dist-packages/celery/app/utils.py", line 235, in find_app 
    sym = symbol_by_name(app, imp=imp) 
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/base.py", line 492, in symbol_by_name 
    return symbol_by_name(name, imp=imp) 
  File "/usr/local/lib/python2.7/dist-packages/kombu/utils/__init__.py", line 96, in symbol_by_name 
    module = imp(module_name, package=package, **kwargs) 
  File "/usr/local/lib/python2.7/dist-packages/celery/utils/imports.py", line 101, in import_from_cwd 
    return imp(module, package=package) 
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
  File "/root/standAlone/tasks.py", line 13, in <module> 
    django.setup() 
  File "/usr/local/lib/python2.7/dist-packages/django/__init__.py", line 27, in setup 
    apps.populate(settings.INSTALLED_APPS) 
  File "/usr/local/lib/python2.7/dist-packages/django/apps/registry.py", line 85, in populate 
    app_config = AppConfig.create(entry) 
  File "/usr/local/lib/python2.7/dist-packages/django/apps/config.py", line 90, in create 
    module = import_module(entry) 
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
ImportError: No module named m 

更新 3

原来我需要改变

INSTALLED_APPS     = ("myApp") 

到

INSTALLED_APPS     = ("myApp",) 

然后一切正常!

请您参考如下方法:

您需要在调用 django.setup() 之前配置您的设置。只需切换语句即可解决问题:

# tasks.py 
import django 
from celery import Celery 
from django.conf import settings 
 
 
settings.configure( 
    DATABASE_ENGINE    = "django.db.backends.mysql", 
    DATABASE_NAME      = "myDatabase", 
    DATABASE_USER      = "myUsername", 
    DATABASE_PASSWORD  = "myPassword", 
    DATABASE_HOST      = "my host", 
    DATABASE_PORT      = "3306", 
    INSTALLED_APPS     = ("myApp",)  # Move the comma out of the quotes 
) 
django.setup()