python
  • django
  • celery
  • 2017-10-31 12 views 2 likes 
    2

    task.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 
    

    views.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}) 
    

    cart.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 
    

    は今セロリのタスクは、メールとビュー機能を送り、カートと注文から値を取った後の順序を作成します形。注文を作成するためにタスクをどのように変更できますか?そうするのが良い習慣ですか?誰かが私を助けることを望む、ありがとう。また、djangoメッセージフレームワークをセロリタスクとして使用して成功メッセージを出すことも可能ですか?

    答えて

    2

    私は(私の会社ではいくつかのウェブショップを運営していますが)非同期的に注文を作成しません。ユーザーに感謝のページが表示されたら、注文が作成されていることを確認してください。結局のところ、DB操作の数はほんの数であり、ページ速度は問題にはなりません。しかし、メール送信は、要求応答サイクルを長くしてはならない典型的なタスクの例です。しかし一つのこと:あなたはあなたのタスク秒のカップルの安全遅延を与えることを検討することをお勧めします: - あなたのデータベースに設定された原子の要求を持っている場合は特に -

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

    ためだけに作成されているタスクワーカー注文作成トランザクションがコミットされて作業者に見えるようになる前に、その注文を照会することができる。また、transaction.on_commitフックを使用して競合状態を回避することもできます。

    +0

    ご返信いただきありがとうございます。これは実際の使用例ではありません。クライアントは注文作成をセロリの仕事として見たいと考えています。 – user6837382

    +0

    さて、カートの関連セッションデータを適切なタスク引数にシリアル化する必要があります:)メッセージの質問のためにBTW:UserMessageモデルをデータベースに書き込んで、カスタムミドルウェアを選択する必要があります適切なユーザーの次の要求が発生したときに起動します。 – schwobaseggl

    +0

    もう一度ありがとう – user6837382

    関連する問題