Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to solve the a celery worker configuration with keyword argument namespace='"CELERY"error in the celery file

I have a project name called ShippingApp and I followed the steps to set up the celery worker. I am using celery 3.1.26.post2 with python3.7 and when I want to start the Celery Worker I am getting the error below:

E:\ShippingApp>celery -A ShippingApp worker -l info
Traceback (most recent call last):
  File "c:\program files\python37\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\program files\python37\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Program Files\Python37\Scripts\celery.exe\__main__.py", line 9, in <module>
  File "c:\program files\python37\lib\site-packages\celery\__main__.py", line 30, in main
    main()
  File "c:\program files\python37\lib\site-packages\celery\bin\celery.py", line 81, in main
    cmd.execute_from_commandline(argv)
  File "c:\program files\python37\lib\site-packages\celery\bin\celery.py", line 793, in execute_from_commandline
    super(CeleryCommand, self).execute_from_commandline(argv)))
  File "c:\program files\python37\lib\site-packages\celery\bin\base.py", line 309, in execute_from_commandline
    argv = self.setup_app_from_commandline(argv)
  File "c:\program files\python37\lib\site-packages\celery\bin\base.py", line 469, in setup_app_from_commandline
    self.app = self.find_app(app)
  File "c:\program files\python37\lib\site-packages\celery\bin\base.py", line 489, in find_app
    return find_app(app, symbol_by_name=self.symbol_by_name)
  File "c:\program files\python37\lib\site-packages\celery\app\utils.py", line 235, in find_app
    sym = symbol_by_name(app, imp=imp)
  File "c:\program files\python37\lib\site-packages\celery\bin\base.py", line 492, in symbol_by_name
    return symbol_by_name(name, imp=imp)
  File "c:\program files\python37\lib\site-packages\kombu\utils\__init__.py", line 96, in symbol_by_name
    module = imp(module_name, package=package, **kwargs)
  File "c:\program files\python37\lib\site-packages\celery\utils\imports.py", line 101, in import_from_cwd
    return imp(module, package=package)
  File "c:\program files\python37\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "E:\ShippingApp\ShippingApp\__init__.py", line 2, in <module>
    from .celery import app as celery_app
  File "E:\ShippingApp\ShippingApp\celery.py", line 6, in <module>
    app.config_from_object('django.conf:settings', namespace='CELERY')
TypeError: config_from_object() got an unexpected keyword argument 'namespace'

celery.py:

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')

app = Celery('mysite')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

init.py:

from .celery import app as celery_app

tasks.py:

from celery import task
from django.core.mail import send_mail
from .models import Order
@task
def order_created(order_id):
    """
    Task to send an e-mail notification when an order is
    successfully created.
    """
    order = Order.objects.get(id=order_id)
    subject = 'Order nr. {}'.format(order.id)
    message = 'Dear {},\n\nYou have successfully placed an order.\
    Your order id is {}.'.format(order.first_name,
    order.id)
    mail_sent = send_mail(subject,
                        message,
                        '[email protected]',
    [order.email])
    return mail_sent

In the orders view, we have the code below:

def order_create(request):
cart = Cart(request)
if request.method == 'POST':
    form = OrderCreateForm(request.POST)
    if form.is_valid():
        order = form.save()
        for item in cart:
            OrderItem.objects.create(order=order,
                                    product=item['product'],
                                    price=item['price'],
                                    quantity=item['quantity'])
        # clear the cart
        cart.clear()
        # launch asynchronous task
        order_created.delay(order.id)
        # set the order in the session
        request.session['order_id'] = order.id
        # redirect for payment
        return redirect(reverse('payment:process'))
else:
    form = OrderCreateForm()
return render(request,
            'orders/order/create.html',
            {'cart': cart, 'form': form})

Before I was using celery 4.2.1 but it was not compatible with windows 10 and I uninstall it and install the version 3.1.26.post2. Please assist.

like image 902
Mohamed Abdillah Avatar asked Feb 22 '19 19:02

Mohamed Abdillah


People also ask

What is a Celery in Python?

Celery is an open-source Python library which is used to run the tasks asynchronously. It is a task queue that holds the tasks and distributes them to the workers in a proper manner. It is primarily focused on real-time operation but also supports scheduling (run regular interval tasks).

Do I need Celery Python?

Celery allows Python applications to quickly implement task queues for many workers. It takes care of the hard part of receiving tasks and assigning them appropriately to workers. You use Celery to accomplish a few main goals: Define independent tasks that your workers can do as a Python function.

How does Celery workers Python?

Celery is a task queue implementation for Python web applications. Meaning, it allows Python applications to rapidly implement task queues for many workers. It essentially does the hard work in that it receives tasks and then assigns them to workers as needed.

What is Apply_async in Celery?

apply_async(args[, kwargs[, …]]) Sends a task message. delay(*args, **kwargs) Shortcut to send a task message, but doesn't support execution options. calling ( __call__ )


1 Answers

The uppercase namespace means that all celery configurations must be specified with uppercase instead of lowercase, and start with CELERY_, so that for example, task_always_eager settings becomes CELERY_TASK_ALWAYS_EAGER, and the broker_url becomes CELERY_BROKER_URL ans so on. This configuration was introduced from celery4.0 onwards.

So, for version <4 you don't need namespace in line:

app.config_from_object('django.conf:settings', namespace='CELERY')

Replace the above with:

app.config_from_object('django.conf:settings')

NOTE: If you use celery 3.1, please check your Django version. It should be <1.8

like image 160
Reema Parakh Avatar answered Nov 15 '22 15:11

Reema Parakh