Очистите корзину в приложении django, которая сохраняется в сессии с помощью задачи clery

hello я пытаюсь создать приложение электронной коммерции с Django у меня есть класс корзины, который woek с сессией вот мой класс корзины :

каждый раз, когда пользователи добавляют товар в корзину, я уменьшаю число на количество товара, и у меня есть задача проверить, если их корзина находится в идеале более 30 минут, сначала отправить смс пользователю и напомнить им о корзине, и после более чем 1 час очистить корзину и добавить количество товара обратно. Проблема в том, что когда в задаче я пытаюсь зациклиться на всех сессиях и изменить эту сессию с session_data[«sms_sent»] = True после этого она снова отправит смс, также когда пройдет более 1 часа она добавит количество обратно в базу данных, но она не очистит корзину из сессии

вот задача, которую я использую :

@shared_task
def clear_abandoned_carts():
    expired_time = timezone.now() - CART_EXPIRATION_TIME
    warning_time = timezone.now() - SEND_WARNING_TIME

    for session in Session.objects.filter(expire_date__gte=timezone.now()):
        data = session.get_decoded()
        last_updated_str = data.get("last_updated")
        cart = data.get(settings.CART_SESSION_ID)
        print("sms_sent flag before:", data.get("sms_sent"))  # Safe access

        if cart and last_updated_str:
            last_updated = timezone.datetime.fromisoformat(last_updated_str)

            if last_updated < expired_time:
                # Clear cart if expired
                for key, item in cart.items():
                    color_id = item["color_id"]
                    quantity = item["quantity"]
                    try:
                        remove_from_cart(color_id, int(quantity))
                    except ProductColor.DoesNotExist:
                        pass  # Handle as needed

                # Clear session data
                session_data = session.get_decoded()
                session_data.pop(settings.CART_SESSION_ID, None)
                session_data.pop("last_updated", None)
                session_data.pop("have_discount_code", None)
                session_data.pop("discount_code_amount", None)
                session_data.pop("sms_sent", None)
                session_data["modified"] = True

                session.save()
                cart_instance = Cart(data)
                cart_instance.clear()

            elif last_updated < warning_time:
                # Check if the SMS warning was already sent
                if not data.get("sms_sent"):  # Proceed only if SMS hasn't been sent
                    user_id = data.get("user_id")
                    if user_id:
                        try:
                            user = CustomUser.objects.get(id=user_id)
                            if user.phone_number:
                                phone_number = user.phone_number
                                send_cart_warning(int(phone_number))  # Send SMS

                                # Mark SMS as sent in session data
                                session_data = session.get_decoded()
                                session_data["sms_sent"] = True  # Safely update session
                                session_data["modified"] = True
                                session.modified = True
                                session.save()

                                print("sms_sent flag after:", session_data.get("sms_sent"))  # Safe access

                        except CustomUser.DoesNotExist:
                            pass

в консоли при отправке сообщения вот это print(«sms_sent flag after:», session_data.get(«sms_sent»)) выдает True, но при повторном запуске вот это print(«sms_sent flag before:», data.get(«sms_sent»)) выдает None, ребята, помогите мне решить эту проблему пожалуйста

При обновлении данных сеанса в задаче Celery убедитесь, что сеанс помечен как измененный и сохранен должным образом. например:

@shared_task
def clear_abandoned_carts():
    expired_time = timezone.now() - CART_EXPIRATION_TIME
    warning_time = timezone.now() - SEND_WARNING_TIME

    for session in Session.objects.filter(expire_date__gte=timezone.now()):
        data = session.get_decoded()
        last_updated_str = data.get("last_updated")
        cart = data.get(settings.CART_SESSION_ID)
        print("sms_sent flag before:", data.get("sms_sent"))  # Safe access

        if cart and last_updated_str:
            last_updated = timezone.datetime.fromisoformat(last_updated_str)

            if last_updated < expired_time:
                # Clear cart if expired
                for key, item in cart.items():
                    color_id = item["color_id"]
                    quantity = item["quantity"]
                    try:
                        remove_from_cart(color_id, int(quantity))
                    except ProductColor.DoesNotExist:
                        pass  # Handle as needed

                # Clear session data
                session_data = session.get_decoded()
                session_data.pop(settings.CART_SESSION_ID, None)
                session_data.pop("last_updated", None)
                session_data.pop("have_discount_code", None)
                session_data.pop("discount_code_amount", None)
                session_data.pop("sms_sent", None)

                # Mark session as modified and save
                session_data["modified"] = True
                session.session_data = Session.objects.encode(session_data)
                session.save()

            elif last_updated < warning_time:
                # Check if the SMS warning was already sent
                if not data.get("sms_sent"):
                    user_id = data.get("user_id")
                    if user_id:
                        try:
                            user = CustomUser.objects.get(id=user_id)
                            if user.phone_number:
                                phone_number = user.phone_number
                                send_cart_warning(int(phone_number))  # Send SMS

                                # Mark SMS as sent in session data
                                session_data = session.get_decoded()
                                session_data["sms_sent"] = True
                                session_data["modified"] = True
                                session.session_data = Session.objects.encode(session_data)
                                session.save()

                        except CustomUser.DoesNotExist:
                            pass

убедитесь, что данные корзины удаляются из сессии, а сама сессия после этого сохраняется.

def clear(self):
    # Remove cart-related data from session
    keys_to_remove = [
        settings.CART_SESSION_ID,
        'have_discount_code',
        'discount_code_amount',
        'last_updated',
        'sms_sent'
    ]
    for key in keys_to_remove:
        self.session.pop(key, None)

    # Mark session as modified and save
    self.mark_session_modified()
Вернуться на верх