定义如下的芹菜任务:
from celery.decorators import task
@task(name="send_email")
def send_email(email, host):
当这样称呼它时,Django 会卡住:
send_email.delay(email, host)
就像它不是异步运行的一样,
我错过了什么?
这些是一些芹菜设置,它使用 redis 作为代理:
>>> settings.CELERY_ACCEPT_CONTENT
[u'application/json']
>>> settings.CELERY_BROKER_URL
u'redis://redis:6379/0'
>>> settings.CELERY_RESULT_BACKEND
u'redis://redis:6379/0'
>>> settings.CELERY_RESULT_SERIALIZER
u'json'
>>>
我宁愿发表评论,但我首先需要 50 次,但我们需要其余的函数。除非您向我们展示您正在做的所有事情,否则无法修复。因为你没有展示它,所以我会给你看我的一个,希望它能让你清楚地知道你做错了什么。我有几个芹菜电子邮件函数,但它们只接受 1 个参数(来自对象的 id(,并将值返回给调用它的函数。请注意,您还需要让您的 settings.py 包含正确的EMAIL_BACKEND等设置(如EMAIL_HOST等(。
但是,如果您只使用控制台,则唯一需要的电子邮件设置是EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
.以下示例适用于此示例,只要您运行芹菜,并且所有内容都指向正确的位置。
例:
假设模型等已正确导入,因此短绒不会显示错误,并且所有这些都在一个文件中。
@task
def order_created(order_id):
"""Task to send an email notification when an order is successfully created"""
order = Order.objects.get(id=order_id)
subject = 'Order number {}'.format(order.id)
message = 'Dear {},nnYou have successfully made an order. Your order id is {}.'.format(order.first_name, order.id)
mail_sent = send_mail(subject, message, 'you@your_email.com', [order.email])
return mail_sent
def make_an_order(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'])
cart.clear()
order_created.delay(order.id) # id is passed to celery function
request.session['order_id'] = order.id
return redirect(reverse('payment_app:process'))
else:
form = OrderCreateForm() # instantiates form based on Order model.
return render(request, 'orders_app/create.html', {'cart': cart, 'form': form})