[英]Django: celery task does not execute with .delay()
我正在使用“Django 2 by Example”一書中的代碼示例來構建我的電子商務商店。 視圖正常工作,但任務永遠不會執行。 沒有錯誤。 頁面在“等待本地主機...”上凍結。 我在代碼中做錯了什么?
視圖.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})
任務.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,
'archeski.dk@gmail.com',
[order.email])
return mail_sent
我正在使用celery==4.2.0
Django==2.0.7
Ubuntu 18.04
更新:在celery.py 中添加了這兩行代碼。 凍結已經消失,訂單頁面現在重定向我以進行進一步的付款程序。 但是任務order_created
仍然沒有運行。
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
輸出這個:
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\"}}"
您能否像入門指南中提到的那樣,仔細檢查是否在__init__.py
文件中導入了 Celery 應用程序? https://docs.celeryproject.org/en/latest/django/first-steps-with-django.html
我遇到了一個類似的問題,其他一切看起來都正確,但是當我使用.delay()
時任務掛了
添加導入立即解決了問題。
也許這有幫助:
您必須更新項目 conf 文件夾init .py 文件:
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
我也在學習芹菜,兩天前開始。 我的經驗是,在將 celery 集成到 Web 應用程序之前,您需要獨立部署它。
訪問 celery 文檔頁面后,我能夠成功啟動我的 celery 應用程序。
從最簡單的演示開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.