gpt4 book ai didi

python - 有没有办法将 View 函数转换为 celery 任务?

转载 作者:太空宇宙 更新时间:2023-11-04 02:39:10 25 4
gpt4 key购买 nike

任务.py

@task(name="send_mail_to_custormer")
def order_created(order_id):
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.last_name, order.id)
from_email = settings.EMAIL_HOST_USER
to_email = [order.email]
mail_sent = send_mail(
subject,
message,
from_email,
to_email,
fail_silently=False
)
return mail_sent

View .py

def order_create(request):
cart = Cart(request)
if request.method == 'POST':
form = OrderCreateForm(request.POST)
if form.is_valid():
order = form.save()
for item in cart:
try:
OrderItem.objects.create(order=order,
product=item['product'],
price=item['price'],
quantity=item['quantity'])
except:
pass
cart.clear()
order_created.delay(order.id)
return render(request,'orders/order_created.html', {'cart': cart, 'order': order})
else:
form = OrderCreateForm()
return render(request, 'orders/order_create.html', {'cart': cart, 'form': form})

购物车.py

class Cart(object):

def __init__(self, request):
self.session = request.session
cart = self.session.get(settings.CART_SESSION_ID)
if not cart:
cart = self.session[settings.CART_SESSION_ID] = {}
self.cart = cart

def add(self, product, quantity=1, update_quantity=False):
product_id = str(product.id)
if product_id not in self.cart:
self.cart[product_id] = {'quantity': 0,
'price': str(product.price)}
if update_quantity:
self.cart[product_id]['quantity'] = quantity
else:
self.cart[product_id]['quantity'] += quantity
self.save()

def save(self):
self.session[settings.CART_SESSION_ID] = self.cart
self.session.modified = True

现在,celery 任务发送邮件, View 函数在从购物车和订单表单中获取值后创建订单。我如何更改任务以创建订单?这样做是一种好习惯吗?希望有人能帮助我,谢谢。也可以使用 django 消息框架作为 celery 任务来发送成功消息吗?

最佳答案

我不会也不会(在我的公司经营几个网上商店)异步创建订单。当用户看到您的感谢页面时,您最好确保已创建订单。毕竟这只是几个数据库操作,页面速度不会成为问题。然而,邮件发送是不应延长您的请求-响应周期的任务的典型示例。不过有一件事:您可能需要考虑为您的任务设置几秒钟的安全延迟:

order_created.apply_async(args=[order.id], countdown=5)

订单刚刚创建 - 特别是如果您为数据库设置了原子请求 - 任务工作人员可以在订单创建事务提交并对工作人员可见之前查询订单。或者,您可以使用 transaction.on_commit钩子(Hook)以避免这种竞争条件。

关于python - 有没有办法将 View 函数转换为 celery 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47045791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com