我的 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")
事实上,您的模型字段中有
blank = True
和 null = True
,这意味着当您创建 db/model 对象时,它将接受空数据而不会引发错误。
仅供参考:
blank = True
表示表单中的数据可以为空
null = True
将在数据库本身中设置 NULL
(允许为空)。