ФорумПрограммированиеPythonDjango → Django-celery работа с моделями в таске

Django-celery работа с моделями в таске

  • john2dark

    Сообщения: 98 Репутация: N Группа: Адекваты

    Spritz 4 июня 2016 г. 2:52

    Объясните пожалуйста (если можно с примерами), каким образом обращаться к орму джанги в таске Celery?
    У меня в трейсбеке мат на мате стоит при попытке импорта модели.
    Смотрел чужие примеры, народ не парясь делает в тасках

    from myapp.models import MyModel
    и далее
    
    @task
    def process_object(pk):
        obj = MyModel.objects.get(pk)

    У меня же сплошняком

    
      File "D:\python27\lib\importlib\__init__.py", line 37, in import_module
        __import__(name)
      File "e:\projects\blabla\repo\blabla\jobs\tasks.py", line 6, in <module>
        from members.models import Session
      File "e:\projects\blabla\repo\blabla\members\models\__init__.py", line 2, in <module>
        from subscription import *
      File "e:\projects\blabla\repo\blabla\members\models\subscription.py", line 10, in <module>
        class SubscriptionPlan(models.Model):
      File "D:\python27\lib\site-packages\django\db\models\base.py", line 94, in __new__
        app_config = apps.get_containing_app_config(module)
      File "D:\python27\lib\site-packages\django\apps\registry.py", line 239, in get_containing_app_config
        self.check_apps_ready()
      File "D:\python27\lib\site-packages\django\apps\registry.py", line 124, in check_apps_ready
        raise AppRegistryNotReady("Apps aren't loaded yet.")
    AppRegistryNotReady: Apps aren't loaded yet.
    [2016-06-04 09:01:47,657: ERROR/MainProcess] Process 'Worker-2' pid:9908 exited with 'exitcode 1'

    Почему оно еще не загружено? И как обращаться к орму?

  • Sinkler

    Сообщения: 9648 Репутация: N Группа: в ухо

    Spritz 4 июня 2016 г. 4:42, спустя 1 час 50 минут 13 секунд

    @john2dark, давно не юзал, но в последний раз прописывал в файле с тасками так

    from __future__ import absolute_import
    
    import os
    from celery import Celery
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')
    
    app = Celery('project')
    
    app.config_from_object('django.conf:settings')
    
  • john2dark

    Сообщения: 98 Репутация: N Группа: Адекваты

    Spritz 4 июня 2016 г. 4:46, спустя 4 минуты 15 секунд

    @Sinkler, спасибо, щас буду пробовать.

  • john2dark

    Сообщения: 98 Репутация: N Группа: Адекваты

    Spritz 5 июня 2016 г. 6:00, спустя 1 день 1 час 13 минут

    Не работает, такая же ошибка с Apps aren't loaded yet.

    -- project_blabla
       |-- members
           |-- models
               |-- __init__.py
               |-- subscription.py
               |-- project.py  **<-- class Session inside**
               |-- ...
       |-- tasks.py
       |-- manage.py

    Содержимое tasks.py

    from __future__ import absolute_import
    from django.conf import settings
    from celery import Celery
    import os
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings.development')
    app = Celery('project_blabla')
    
    from members.models import Session
    
    app.config_from_object('django.conf:settings')
    app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
    
    @app.task(max_retries=1)
    def session_delete(sids):
        try:
            for s in sids:
                # just for test
                a = Session.objects.filter(
                    pk=s,
                    deleted_at__isnull=False
                ).get()
    
                print str(a)
    
        except Exception, e:
            return 'Cannot delete session(s): ' + str(e)
    

    Вываливает

    [2016-06-05 03:22:39,263: ERROR/Worker-1] Process Worker-1
    Traceback (most recent call last):
      File "D:\python27\lib\site-packages\billiard\process.py", line 292, in _bootstrap
        self.run()
      File "D:\python27\lib\site-packages\billiard\pool.py", line 292, in run
        self.after_fork()
      File "D:\python27\lib\site-packages\billiard\pool.py", line 395, in after_fork
        self.initializer(*self.initargs)
      File "D:\python27\lib\site-packages\celery\concurrency\prefork.py", line 58, in process_initializer
        app.loader.init_worker()
      File "D:\python27\lib\site-packages\celery\loaders\base.py", line 128, in init_worker
        self.import_default_modules()
      File "D:\python27\lib\site-packages\djcelery\loaders.py", line 140, in import_default_modules
        super(DjangoLoader, self).import_default_modules()
      File "D:\python27\lib\site-packages\celery\loaders\base.py", line 121, in import_default_modules
        tuple(maybe_list(self.app.conf.CELERY_INCLUDE))
      File "D:\python27\lib\site-packages\celery\loaders\base.py", line 103, in import_task_module
        return self.import_from_cwd(module)
      File "D:\python27\lib\site-packages\celery\loaders\base.py", line 112, in import_from_cwd
        package=package,
      File "D:\python27\lib\site-packages\celery\utils\imports.py", line 101, in import_from_cwd
        return imp(module, package=package)
      File "D:\python27\lib\site-packages\celery\loaders\base.py", line 106, in import_module
        return importlib.import_module(module, package=package)
      File "D:\python27\lib\importlib\__init__.py", line 37, in import_module
        __import__(name)
      **File "e:\projects\project_blabla\repo\project_blabla\tasks.py", line 13, in <module>
        from members.models import Session
      File "e:\projects\project_blabla\repo\project_blabla\members\models\__init__.py", line 2, in <module>
        from subscription import *
      File "e:\projects\project_blabla\repo\project_blabla\members\models\subscription.py", line 10, in <module>
        class SubscriptionPlan(models.Model):**
      File "D:\python27\lib\site-packages\django\db\models\base.py", line 94, in __new__
        app_config = apps.get_containing_app_config(module)
      File "D:\python27\lib\site-packages\django\apps\registry.py", line 239, in get_containing_app_config
        self.check_apps_ready()
      File "D:\python27\lib\site-packages\django\apps\registry.py", line 124, in check_apps_ready
        raise AppRegistryNotReady("Apps aren't loaded yet.")
    AppRegistryNotReady: Apps aren't loaded yet.

    Вероятнее всего я не до конца понимаю базовые вещи Джанго.
    Кажется, что tasks полностью изолированы от окружения проекта и почему то не получается подцепиться.
    Теоретически можно забить болт на это и организовать прямое хождение в базу минуя орм, с созданием соединения при каждом запуске таска (а таски в итоге будут ездить по расписанию раз в день, так что это с одной стороны приемлемый результат), но с другой стороны похоже на ересь и хочется сделать "как правильно". Может есть у кого идеи в чём может быть ошибка?

  • john2dark

    Сообщения: 98 Репутация: N Группа: Адекваты

    Spritz 5 июня 2016 г. 6:26, спустя 26 минут 44 секунды

    BROKER_URL = 'mongodb://localhost:27017/celery_blabla'
    CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
    CELERY_ACCEPT_CONTENT = ['application/json']
    CELERY_RESULT_SERIALIZER = 'json'
    CELERY_TASK_SERIALIZER = 'json'
    CELERY_SEND_EVENTS = True
    CELERY_TIMEZONE = 'UTC'
    CELERY_IMPORTS = ('tasks',)
  • Sinkler

    Сообщения: 9648 Репутация: N Группа: в ухо

    Spritz 5 июня 2016 г. 6:34, спустя 7 минут 8 секунд

    @john2dark, а в __init__.py добавлял такой код как здесь?

    Asynchronous Tasks with Django and Celery - Real Python [realpython.com]

    from __future__ import absolute_import
    from .celery import app as celery_app
  • john2dark

    Сообщения: 98 Репутация: N Группа: Адекваты

    Spritz 5 июня 2016 г. 6:40, спустя 6 минут 24 секунды

    У меня tasks.py лежит в корне проекта, там же где и manage.py, соответственно __init__.py там нет. Сейчас попробую перенести tasks в core, где у меня настройки и wsgi и добавить в init.

  • john2dark

    Сообщения: 98 Репутация: N Группа: Адекваты

    Spritz 5 июня 2016 г. 13:39, спустя 6 часов 58 минут 55 секунд

    И снова нифига, ошибка плавно перетекла в иное измерение

    Traceback (most recent call last):
      File "E:/projects/project_blabla/repo/project_blabla/manage.py", line 8, in <module>
        execute_from_command_line(sys.argv)
      File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 353, in execute_from_command_line
        utility.execute()
      File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 302, in execute
        settings.INSTALLED_APPS
      File "C:\Python27\lib\site-packages\django\conf\__init__.py", line 55, in __getattr__
        self._setup(name)
      File "C:\Python27\lib\site-packages\django\conf\__init__.py", line 43, in _setup
        self._wrapped = Settings(settings_module)
      File "C:\Python27\lib\site-packages\django\conf\__init__.py", line 99, in __init__
        mod = importlib.import_module(self.SETTINGS_MODULE)
      File "C:\Python27\lib\importlib\__init__.py", line 37, in import_module
        __import__(name)
    
    
      File "E:\projects\project_blabla\repo\project_blabla\core\__init__.py", line 5, in <module>
        from .tasks import app as celery_app
      File "E:\projects\project_blabla\repo\project_blabla\core\tasks.py", line 13, in <module>
        from members.models import Session
      File "E:\projects\project_blabla\repo\project_blabla\acc\models.py", line 2, in <module>
        from django.contrib.auth.base_user import AbstractBaseUser
    
    
      File "C:\Python27\lib\site-packages\django\contrib\auth\base_user.py", line 49, in <module>
        class AbstractBaseUser(models.Model):
      File "C:\Python27\lib\site-packages\django\db\models\base.py", line 94, in __new__
        app_config = apps.get_containing_app_config(module)
      File "C:\Python27\lib\site-packages\django\apps\registry.py", line 239, in get_containing_app_config
        self.check_apps_ready()
      File "C:\Python27\lib\site-packages\django\apps\registry.py", line 124, in check_apps_ready
        raise AppRegistryNotReady("Apps aren't loaded yet.")
    django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

    Вот жеж хрень...

  • phpdude

    Сообщения: 26610 Репутация: N Группа: в ухо

    Spritz 5 июня 2016 г. 13:41, спустя 2 минуты 25 секунд

    ох ебать )

    Сапожник без сапог
  • john2dark

    Сообщения: 98 Репутация: N Группа: Адекваты

    Spritz 5 июня 2016 г. 13:59, спустя 17 минут 12 секунд

    @phpdude, даваще, пИчалька

Пожалуйста, авторизуйтесь, чтобы написать комментарий!