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. и приложение заработало идеально.

Вернуться на верх