Недавно я настроил сельдерей для выполнения некоторых фиктивных задач и запустил рабочих через Terminal на моем Mac. Кажется, что все это сработало, потребовалось некоторое время, так как некоторые из литературы, похоже, дают советы по различным сценариям конфигурации, но я все равно туда попал. Теперь следующий шаг - запустить задачи через мой просмотр в Django. Я использую сельдерей 1.2.26.post2
Моя структура проекта:
/MyApp
celery_tasks.py
celeryconfig.py
__init__.py
Я слежу за несколькими учебниками и нашел это видео, и это видео, и это видео очень полезно, чтобы получить общий обзор сельдерея.
Мои скрипты:
из сельдерея импорта сельдерея из сельдерея . task import task app = Celery () # Инициализировать приложение . config_from_object ( 'celeryconfig' ) # Скажите экземпляр сельдерей , чтобы использовать модуль celeryconfig SUF = лямбда - н : "% d% s" % ( п , { 1 : "ST" , 2 : "й" , 3 : "й" }. получить ( n, если n < 20 else n % 10 , "th" )) @task def fav_doctor (): "" "Читает файл doctor.txt и печатает fav doctor, затем добавляет новый номер в файл" "" с открытым ( 'doctor .txt ' , ' r + ' ) как f : для строки в f : nums = line . rstrip (). split () print ( '{} doctor - мой любимый' . format ( suf ( int ( nums [ 0 ])))) для num in nums [ 1 :]: print ( 'Wait! The {} doctor - мой любимый ' . format ( suf ( int ( num )))) last_num = int ( nums [- 1 ]) new_last_num = last_num + 1 f . write ( str ( new_last_num ) + '' ) @task def reverse ( string ): return string [:: - 1 ] @task def add ( x , y ): return x + y
from datetime import timedelta
## List of modules to import when celery starts.
CELERY_IMPORTS = ('celery_tasks',)
## Message Broker (RabbitMQ) settings.
BROKER_URL = 'amqp://'
BROKER_PORT = 5672
#BROKER_TRANSPORT = 'sqlalchemy'
#BROKER_HOST = 'sqlite:///tasks.db'
#BROKER_VHOST = '/'
#BROKER_USER = 'guest'
#BROKER_PASSWORD = 'guest'
## Result store settings.
CELERY_RESULT_BACKEND = 'rpc://'
#CELERY_RESULT_DBURI = 'sqlite:///mydatabase.db'
## Worker settings
#CELERYD_CONCURRENCY = 1
#CELERYD_TASK_TIME_LIMIT = 20
#CELERYD_LOG_FILE = 'celeryd.log'
#CELERYD_LOG_LEVEL = 'INFO'
## Misc
CELERY_IGNORE_RESULT = False
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT=['json']
CELERY_TIMEZONE = 'Europe/Berlin'
CELERY_ENABLE_UTC = True
CELERYBEAT_SCHEDULE = {
'doctor-every-10-seconds': {
'task': 'celery_tasks.fav_doctor',
'schedule': timedelta(seconds=3),
},
}
celeryconfig.py
from .celery_tasks import app as celery_app # Ensures app is always imported when Django starts so that shared_task will use this app.
__all__ = ['celery_app']
__init__.py
INSTALLED_APPS = [
...
'djcelery',
]
В settings.py
from MyApp.celery_tasks import fav_doctor, reverse, send_email, add
@login_required
def admin_script_dashboard(request):
if request.method == 'POST':
form = Admin_Script(request.POST)
if form.is_valid():
backup_script_select = form.cleaned_data['backup_script_select']
dummy_script_select = form.cleaned_data['dummy_script_select']
print ("backup_script_select: {0}".format(backup_script_select))
print ("dummy_script_select: {0}".format(dummy_script_select))
if backup_script_select:
print ("Backup script exectuting. Please wait...")
dbackup_script_dir = str(Path.home()) + '/Software/MyOtherApp/cli-tools/dbbackup_DRAFT.py'
subprocess.call(" python {} ".format(dbackup_script_dir), shell=True)
async_result = reverse.delay('Using Celery')
print ("async_result: {0}".format(async_result))
result = reverse.AsyncResult(async_result.id)
print ("result: {0}".format(result))
print ("Something occured...")
if dummy_script_select:
print ("Dummy script exectuting. Please wait...")
dummy_script_dir = str(Path.home()) + '/Software/MyOtherApp/cli-tools/dummy.py'
subprocess.call(" python {} ".format(dummy_script_dir), shell=True)
async_result = add.delay(2, 5)
print ("async_result: {0}".format(async_result))
result = add.AsyncResult(async_result.id)
print ("result: {0}".format(result))
print ("Something occured...")
return render(request, 'MyApp/admin_scripts_db.html')
В моей папке views у меня есть определенный модуль просмотра, admin_scripts.py
async_result = add.delay(2, 5)
Проблема возникает в строке моего файла admin_scripts.py , где вызывается. Ниже трассировка:[12/Jul/2018 09:23:19] ERROR [django.request:135] Internal Server Error: /MyProject/adminscripts/ Traceback (most recent call last): File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/local.py", line 309, in _get_current_object return object.__getattribute__(self, '__thing') AttributeError: 'PromiseProxy' object has no attribute '__thing' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/kombu/utils/__init__.py", line 323, in __get__ return obj.__dict__[self.__name__] KeyError: 'conf' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/loaders/base.py", line 158, in _smart_import return imp(path) File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/loaders/base.py", line 112, in import_from_cwd package=package, File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/utils/imports.py", line 101, in import_from_cwd return imp(module, package=package) File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/loaders/base.py", line 106, in import_module return importlib.import_module(module, package=package) File "/Users/MyMBP/anaconda3/lib/python3.6/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 978, in _gcd_import File "<frozen importlib._bootstrap>", line 961, in _find_and_load File "<frozen importlib._bootstrap>", line 948, in _find_and_load_unlocked ModuleNotFoundError: No module named 'celeryconfig' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner response = get_response(request) File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response response = self.process_exception_by_middleware(e, request) File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view return view_func(request, *args, **kwargs) File "/Users/MyMBP/Software/MyProject/MyProjectsite/MyProject/views/admin_scripts.py", line 44, in admin_script_dashboard async_result = add.delay(2, 5) File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/local.py", line 143, in __getattr__ return getattr(self._get_current_object(), name) File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/local.py", line 311, in _get_current_object return self.__evaluate__() File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/local.py", line 341, in __evaluate__ thing = Proxy._get_current_object(self) File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/local.py", line 101, in _get_current_object return loc(*self.__args, **self.__kwargs) File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/app/base.py", line 270, in _task_from_fun '__wrapped__': fun}, **options))() File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/app/task.py", line 201, in __new__ instance.bind(app) File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/app/task.py", line 365, in bind conf = app.conf File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/kombu/utils/__init__.py", line 325, in __get__ value = obj.__dict__[self.__name__] = self.__get(obj) File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/app/base.py", line 638, in conf return self._get_config() File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/app/base.py", line 454, in _get_config self.loader.config_from_object(self._config_source) File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/loaders/base.py", line 140, in config_from_object obj = self._smart_import(obj, imp=self.import_from_cwd) File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/loaders/base.py", line 161, in _smart_import return symbol_by_name(path, imp=imp) File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/kombu/utils/__init__.py", line 96, in symbol_by_name module = imp(module_name, package=package, **kwargs) File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/loaders/base.py", line 112, in import_from_cwd package=package, File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/utils/imports.py", line 101, in import_from_cwd return imp(module, package=package) File "/Users/MyMBP/anaconda3/lib/python3.6/site-packages/celery/loaders/base.py", line 106, in import_module return importlib.import_module(module, package=package) File "/Users/MyMBP/anaconda3/lib/python3.6/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 978, in _gcd_import File "<frozen importlib._bootstrap>", line 961, in _find_and_load File "<frozen importlib._bootstrap>", line 948, in _find_and_load_unlocked ModuleNotFoundError: No module named 'celeryconfig'
celery_tasks.py
Многочисленные ошибки попадают, и трассировка очень велика, всего около 9000 строк. Это всего лишь фрагмент. Я новичок в сельдерее и задачах в целом, поэтому, возможно, для некоторых экспертов вы можете выбрать некоторые очень очевидные ошибки из моего кода.
Как я уже сказал, конфигурация сельдерея успешна, и при запуске задач в Терминале задачи выполняют то, что они должны делать. Я строю это по частям, поэтому следующий шаг - запустить задачи, используя мой взгляд в Django (вместо того, чтобы вызываться с помощью Terminal). Как только я это понял, конечная цель - отслеживать ход выполнения задачи и сообщать о выходе пользователю в отдельном окне (.js, AJAX и т. Д.), Который показывает, например, вывод строки, который вы видите в Консоль.
Я прочитал, что файл tasks.py (в моем случае celery_tasks.py) должен находиться в приложении django, зарегистрированном в settings.py. Это правда?