是否有一种特定的方法来取消django芹菜中的任务

时间:2017-07-26 12:43:12

标签: python django celery

我的问题是我有一个通过celery的apply_async每3天执行一次的功能。如果未在2天内获得批准,我会将挂单设置为取消。问题是,如果管理员重新考虑它并将状态更改回挂起,则计时器应重新启动,到期时间不会终止。我不确定celery的.revoke()是否会专门取消一个.expire()调用。我不希望他们都只停止一个特定的。有人可以帮忙吗?

tasks.py

@app.task(name="expire")

def expire(order_id):
    print(order_id)
    print("this works")
    try:
        order = Order.objects.get(id=order_id)
        print(order)
    except:
        print(f"Failed retrieving order object of id {order_id}")
        return

    if order.status != "P":
        return

    # Place products back to inventory
    line_items = order.orderlineitems_set.all()

    for line_item in line_items:
        product = line_item.product
        quantity = line_item.quantity

        product.quantity += quantity
        product.save()

    # Cancel order
    order.status = "C"
    print(order.status)
    order.save()

views.py

class PurchaseView(View):
    @staticmethod
    @login_required
    @customer_required
    def get(request):
        cart = Cart(request=request)

        if not cart.is_approved:
            print("Cart is not approved")
            return redirect("/checkout/cart/")

        customer = Customer.objects.get(user=request.user)
        order = cart.convert_to_order(customer=customer)
        cart.reset_cart()
        print(order.status)
        expire.apply_async(args=(order.id,), eta=datetime.utcnow() + timedelta(days=3))

        context = make_context(request)
        context["total_price"] = order.total_price

        return render(request, 'purchase.html', context)

1 个答案:

答案 0 :(得分:0)

我通过添加bind = True并使用self来获取任务ID

来解决这个问题
@app.task(bind=True, name="expire")
def expire(self,order_id):
    print(f"the task queue id is {self.request.id}")
    try:
        order = Order.objects.get(id=order_id)
        print(f"the order status is {order.status}")
    except:
        print(f"Failed retrieving order object of id {order_id}")
        return


    if order.status == "C":
        print(f"this process terminated, order status:{order.status}")
        app.control.revoke(self.request.id, terminate = True)
相关问题