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
все еще не существует.
Надеюсь, это помогло!