Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django: celery task does not execute with .delay()

I'm using code examples from the 'Django 2 by Example' book to build my e-commerce shop. The view works as it should, but the task never gets executed. There are no errors. Page is freezing on "Waiting for localhost...". What I'm doing wrong in the code?

views.py

   import ...
   from .tasks import order_created

        def order_create(request):
            cart = Cart(request)
            if request.method == 'POST':
                form = OrderCreateForm(request.POST)

                if form.is_valid():
                    order = form.save(commit=False)
                    if cart.promo_code:
                        order.promo_code = cart.promo_code
                        order.discount = cart.promo_code.discount
                    order.save()

                    for item in cart:
                        OrderItem.objects.create(order=order,
                                                 book=item['book'],
                                                 price=item['price'],
                                                 quantity=item['quantity'])
                    # clear the cart
                    cart.clear()
                    print("clean cart")
                    # set the order in the session
                    request.session['order_id'] = order.id
                    print("id  - check")
                    # launch asynchronous task
                    order_created.delay(order.id) # here I stuck
                    print("clean cart")
                    # redirect for payment
                    return redirect(reverse('payment:process'))
            else:
                form = OrderCreateForm()
            return render(request,
                          'orders/order/create.html',
                          {'cart': cart, 'form': form})

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

I'm using celery==4.2.0 Django==2.0.7 Ubuntu 18.04

UPDATED: Added this two lines of code in celery.py. And freezing has disappear, order page now redirects me for further payment prosedure. But the task order_created still not running.

  app.conf.broker_url = 'redis://localhost:6379/1'
    # app.conf.broker_transport_options = {'visibility_timeout': 3600}  # 1 hour.
    app.config_from_object('django.conf:settings', namespace='CELERY')

$ redis-cli MONITOR

outputs this:

OK
1531137225.134559 [1 127.0.0.1:48116] "ZREVRANGE" "book:1:purchased_with" "0" "-1"
1531137240.820217 [1 127.0.0.1:48130] "LPUSH" "celery" "{\"body\": \"W1szMV0sIHt9LCB7ImNhbGxiYWNrcyI6IG51bGwsICJlcnJiYWNrcyI6IG51bGwsICJjaGFpbiI6IG51bGwsICJjaG9yZCI6IG51bGx9XQ==\", \"content-encoding\": \"utf-8\", \"content-type\": \"application/json\", \"headers\": {\"lang\": \"py\", \"task\": \"orders.tasks.order_created\", \"id\": \"172d5ec0-9b53-4766-bc04-470631a3a8e4\", \"shadow\": null, \"eta\": null, \"expires\": null, \"group\": null, \"retries\": 0, \"timelimit\": [null, null], \"root_id\": \"172d5ec0-9b53-4766-bc04-470631a3a8e4\", \"parent_id\": null, \"argsrepr\": \"(31,)\", \"kwargsrepr\": \"{}\", \"origin\": \"gen24500@archeski-Inspiron-5558\"}, \"properties\": {\"correlation_id\": \"172d5ec0-9b53-4766-bc04-470631a3a8e4\", \"reply_to\": \"b8b0c8bb-1931-3be2-a044-d588d95c2fe9\", \"delivery_mode\": 2, \"delivery_info\": {\"exchange\": \"\", \"routing_key\": \"celery\"}, \"priority\": 0, \"body_encoding\": \"base64\", \"delivery_tag\": \"249e3deb-489b-4e0b-bde7-54160d3ccaaf\"}}"
1531137464.423873 [0 127.0.0.1:48192] "SELECT" "1"
1531137464.424085 [1 127.0.0.1:48192] "ZREVRANGE" "book:1:purchased_with" "0" "-1"
1531137479.993181 [0 127.0.0.1:48198] "SELECT" "1"
1531137479.993295 [1 127.0.0.1:48198] "PING"
1531137479.994161 [0 127.0.0.1:48200] "SELECT" "1"
1531137479.994260 [1 127.0.0.1:48200] "MULTI"
1531137479.994279 [1 127.0.0.1:48200] "LLEN" "celery"
1531137479.994286 [1 127.0.0.1:48200] "LLEN" "celery\x06\x163"
1531137479.994291 [1 127.0.0.1:48200] "LLEN" "celery\x06\x166"
1531137479.994295 [1 127.0.0.1:48200] "LLEN" "celery\x06\x169"
1531137479.994299 [1 127.0.0.1:48200] "EXEC"
1531137479.994618 [1 127.0.0.1:48200] "SADD" "_kombu.binding.celery" "celery\x06\x16\x06\x16celery"
1531137479.994977 [1 127.0.0.1:48200] "LPUSH" "celery" "{\"body\": \"W1szMl0sIHt9LCB7ImNhbGxiYWNrcyI6IG51bGwsICJlcnJiYWNrcyI6IG51bGwsICJjaGFpbiI6IG51bGwsICJjaG9yZCI6IG51bGx9XQ==\", \"content-encoding\": \"utf-8\", \"content-type\": \"application/json\", \"headers\": {\"lang\": \"py\", \"task\": \"orders.tasks.order_created\", \"id\": \"0fbcecc4-293d-472b-8308-46cb2d9ff345\", \"shadow\": null, \"eta\": null, \"expires\": null, \"group\": null, \"retries\": 0, \"timelimit\": [null, null], \"root_id\": \"0fbcecc4-293d-472b-8308-46cb2d9ff345\", \"parent_id\": null, \"argsrepr\": \"(32,)\", \"kwargsrepr\": \"{}\", \"origin\": \"gen24983@archeski-Inspiron-5558\"}, \"properties\": {\"correlation_id\": \"0fbcecc4-293d-472b-8308-46cb2d9ff345\", \"reply_to\": \"f046e6b8-dd2b-30a4-86a5-0de752377bc7\", \"delivery_mode\": 2, \"delivery_info\": {\"exchange\": \"\", \"routing_key\": \"celery\"}, \"priority\": 0, \"body_encoding\": \"base64\", \"delivery_tag\": \"088bae10-976e-4143-8c28-9ed2e254f2d5\"}}"
1531137480.232213 [1 127.0.0.1:48200] "LPUSH" "celery" "{\"body\": \"W1szM10sIHt9LCB7ImNhbGxiYWNrcyI6IG51bGwsICJlcnJiYWNrcyI6IG51bGwsICJjaGFpbiI6IG51bGwsICJjaG9yZCI6IG51bGx9XQ==\", \"content-encoding\": \"utf-8\", \"content-type\": \"application/json\", \"headers\": {\"lang\": \"py\", \"task\": \"orders.tasks.order_created\", \"id\": \"5aa54a37-95da-43c9-b59e-e6797b7cdd2f\", \"shadow\": null, \"eta\": null, \"expires\": null, \"group\": null, \"retries\": 0, \"timelimit\": [null, null], \"root_id\": \"5aa54a37-95da-43c9-b59e-e6797b7cdd2f\", \"parent_id\": null, \"argsrepr\": \"(33,)\", \"kwargsrepr\": \"{}\", \"origin\": \"gen24983@archeski-Inspiron-5558\"}, \"properties\": {\"correlation_id\": \"5aa54a37-95da-43c9-b59e-e6797b7cdd2f\", \"reply_to\": \"f046e6b8-dd2b-30a4-86a5-0de752377bc7\", \"delivery_mode\": 2, \"delivery_info\": {\"exchange\": \"\", \"routing_key\": \"celery\"}, \"priority\": 0, \"body_encoding\": \"base64\", \"delivery_tag\": \"f78cd769-d7fa-43de-aee9-f7bc5a2c78ac\"}}"

2 Answers

Can you double-check that you imported the Celery app in your __init__.py file like the getting started guide mentions? https://docs.celeryproject.org/en/latest/django/first-steps-with-django.html

I was having a similar issue where everything else looked correct, but the task was hanging when I used .delay()

Adding the import immediately fixed the problem.

like image 108
atm Avatar answered Dec 19 '25 00:12

atm


maybe this helps :

you have to update project conf folder init.py file:

from __future__ import absolute_import

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app  
like image 34
Amir.S Avatar answered Dec 19 '25 00:12

Amir.S



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!