Django/Celery 'Получена незарегистрированная задача типа'
Я довольно долго бился о кирпичную стену с моей простой задачей, которую мне нужно запустить асинхронно с сервера Django. У меня есть форма на странице, которая, когда я отправляю значение, мой views.py выполняет простую функцию умножения из файла tasks2.py, который также содержит мои Celery вещи.
Запустив Celery с помощью этой команды из моего терминала:
celery -A tasks2 worker -l info -P eventlet
При отправке числа "2 в данном случае" через мою форму я получаю следующую ошибку
Received unregistered task of type 'app_scrape.tasks2.my_multiply'.
The message has been ignored and discarded.
Or maybe you're using relative imports?
Please see
http://docs.celeryq.org/en/latest/internals/protocol.html
for more information.
The full contents of the message body was:
'[["2"], {}, {"callbacks": null, "errbacks": null, "chain": null, "chord": null}]' (80b)
Traceback (most recent call last): null}]' (80b)
File "c:\users\likea\.virtualenvs\django-j1eue__k\lib\site-packages\celery\worker\consumer\consumer.py", line 581, in on_task_received ry\worker\consumer\consumer.py", line 581, in on_task_received
strategy = strategies[type_]
KeyError: 'app_scrape.tasks2.my_multiply'
Структура проекта:
- src-estategy
- manage.py
- app_scrape
- views.py
- tasks2.py
- models.py
- ....
- proj_estategy
- __init__.py
- settings.py
- urls.py
- ....
tasks2.py
from celery import Celery
app = Celery('tasks2', broker='amqps://mcbojxac:6sC7n38IdqmNoNgUjmjBkHum6RxRnaqt@clam.rmq.cloudamqp.com/mcbojxac', backend='db+postgresql://kbsrjinigbkzqu:ed0aab74c997b56aa756d510439e28404cf1e87de629a7af66bd49ae29961bbb@ec2-44-195-201-3.compute-1.amazonaws.com/d85tdjbd3am2sc')
@app.task
def my_multiply(x):
print(x)
return x
```
**views.py**
```
#Django
from django.shortcuts import render, redirect
# Form for input into my_multiply
from .forms import UserQueryForm
#Celery
from .tasks2 import my_multiply
def scrape_view(request):
form = UserQueryForm(request.POST or None)
if form.is_valid():
form.save()
data = form.cleaned_data['my_number']
print("success")
my_multiply.delay(data)
context = {
'form': form
}
return render(request, 'scrape.html', context)
Я решил, что это может быть проблема импорта Django/Celery, поэтому я попробовал перенести весь код из tasks2.py непосредственно в views.py, чтобы предотвратить любые проблемы с импортом, но затем, выполнив
celery -A views worker -l info -P eventlet
команды я получаю эту ошибку
File "C:\Users\likea\Documents\Coding\django\src-estategy\app_scrape\views.py", line 5, in <module>
from .forms import UserQueryForm
ImportError: attempted relative import with no known parent package
Для справки вот forms.py
from django import forms
from .models import UserQuery
class UserQueryForm(forms.ModelForm):
class Meta:
model = UserQuery
fields = [
'my_number',
'my_boolean'
]
Я знаю, что это нередкая ошибка, и я просмотрел все соответствующие вопросы, заданные здесь, но ни одно из решений не помогло мне, у меня эта проблема уже несколько недель. Что может быть не так с моим кодом?
У меня было так много проблем с Celery, в итоге я попробовал этот подход на Linux и продвинулся немного дальше, но потом возникли проблемы с чтением переменных окружения, которые были настроены на Heroku. В итоге попробовал rq с официальными инструкциями Heroku. и приложение заработало идеально.