首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拖延调用芹菜任务被卡住了

拖延调用芹菜任务被卡住了
EN

Stack Overflow用户
提问于 2018-08-23 19:32:13
回答 1查看 1.5K关注 0票数 0

芹菜任务定义如下:

代码语言:javascript
复制
from celery.decorators import task

@task(name="send_email")
def send_email(email, host):

像这样调用它时,Django会被卡住:

代码语言:javascript
复制
send_email.delay(email, host)

就像没有异步运行一样,

我遗漏了什么?

这些是一些芹菜的设置,它使用redis做经纪人:

代码语言:javascript
复制
>>> 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'
>>>
EN

回答 1

Stack Overflow用户

发布于 2018-08-23 22:39:54

我宁愿评论,但我首先需要50个代表,但我们需要其余的功能。除非你把你所做的一切都展示给我们,否则是不可能修复的。因为你没有表现出来,我会给你看我的一个,希望它能让你弄清楚你做错了什么。我有一些芹菜电子邮件函数,但它们只接受一个参数(来自对象的id ),并将值返回到调用它的函数。请注意,您还需要让settings.py包含适当的EMAIL_BACKEND等设置(如EMAIL_HOST,等等)。

但是,如果您只使用控制台,您需要的唯一电子邮件设置是EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'。下面的示例适用于此,只要您有芹菜运行,以及指向正确位置的所有东西。

示例:

假设模型等是正确导入的,所以linter没有显示错误,这都在一个文件中。

代码语言:javascript
复制
@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 {},\n\nYou 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})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51993071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档