Очистите корзину в приложении 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()