Django/Heroku - Обработка исключения ObjectDoesNotExist при передаче данных из API в базу данных Django

Мое приложение django получает данные из API.

Очень маловероятно, что API отправит неверную информацию, но я пытаюсь предусмотреть возможность того, что API может отправить данные, которые вернут ObjectDoesNotExist от попыток злоумышленников.

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

Я оставил несколько операторов печати, чтобы отслеживать выполнение попыток. Но ни одна из них не выводится. Это заставляет меня думать, что данные, полученные от API, считаются действительными (потому что они существуют), и только когда данные попадают в базу данных, приложение понимает, что они не существуют.

Есть ли у вас предложение, как мне с этим справиться? (Надеюсь, я ясно выразился)

модели:

class UserProfile(models.Model):
    user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.user)

class ItemisedLoyaltyCard(models.Model):
    user = models.ForeignKey(UserProfile, blank=True, null=True, on_delete=models.CASCADE)
    venue = models.ForeignKey(Venue, blank=True, null=True, on_delete=models.CASCADE, related_name="venueitemisedloyaltycard")
    add_points = models.DecimalField(name = 'add_points', null = True, blank=True, default=0, decimal_places=2, max_digits=5
    
    def __str__(self):
        ret

функция:

def API_data(request):
    userprofile_id = request.GET.get('userprofile_id', '')

    venue_id = request.GET.get('venue_id', '')

    user = UserProfile.objects.get(id=userprofile_id)

    venue = Venue.objects.get(id=venue_id)

    venue_loyalty_point_rule = VenueLoyaltyPointRule.objects.get(venue=venue)

    scans = ItemisedLoyaltyCard.objects.filter(
        user_id=user.id, venue=venue)

    is_point_valid = loyalty_card_validation_rule(
        scans, user, venue, venue_loyalty_point_rule)

    if is_point_valid:
        try_count = 0
        max_retries = 2  # Define the maximum number of retries
        while try_count < max_retries:
            try:
                ItemisedLoyaltyCard.objects.create(
                    user_id=user.id, venue=venue, add_points=venue_loyalty_point_rule.points)
                # If creation succeeds, set data and break the loop
                data = {'points': venue_loyalty_point_rule.points, 'user': user.id, 'venue': venue.name,
                        'success': is_point_valid, 'frequency_rule': venue_loyalty_point_rule.frequency}
                break
            except ObjectDoesNotExist: <!-- This part is not showing getting printed-->
                try_count += 1
                print("Retrying...")
        else:
            # If max retries exceeded, set error message in data
            print("Max retries exceeded. Unable to create loyalty card entry.")
            data = {'error': 'Max retries exceeded. Unable to create loyalty card entry.'}
    else:
        print("Invalid loyalty card validation rule.")
        data = {'error': 'Invalid loyalty card validation rule.'}


    return HttpResponse(json.dumps(data), content_type="application/json")

Вот обходной путь к вашему API для обработки venue существования в приложении.


def API_data(request):
    userprofile_id = request.GET.get('userprofile_id', '')

    venue_id = request.GET.get('venue_id', '')

    user = UserProfile.objects.get(id=userprofile_id)
    
    try:
    
      # first we check if venu id actually exist
      venue = Venue.objects.get(id=venue_id)
      venue_loyalty_point_rule = 
      VenueLoyaltyPointRule.objects.get(venue=venue)

      scans = ItemisedLoyaltyCard.objects.filter(
        user_id=user.id, venue=venue)

      is_point_valid = loyalty_card_validation_rule(
        scans, user, venue, venue_loyalty_point_rule)
      if is_point_valid:
         ItemisedLoyaltyCard.objects.create(
                    user_id=user.id, venue=venue, add_points=venue_loyalty_point_rule.points)
                # If creation succeeds, set data and break the loop
         data = {'points': venue_loyalty_point_rule.points, 'user': user.id, 'venue': venue.name,
                        'success': is_point_valid, 'frequency_rule': venue_loyalty_point_rule.frequency}
      else:
        print("Invalid loyalty card validation rule.")
        data = {'error': 'Invalid loyalty card validation rule.'}
                    
                
    except ObjectDoesNotExist:
      # code flow continue here if venue id does not exist
      print("Retrying")
      



   return HttpResponse(json.dumps(data), content_type="application/json")


Обратите внимание, что я проигнорировал реализованную вами систему подсчета повторных попыток, просто потому, что нет смысла повторять попытку создания еще одного нового объекта ItemisedLoyalityCard, если venue все еще не существует.

Надеюсь, это помогло!

Вернуться на верх