python - Django:修复付款视图中的错误
问题描述
我想知道在付款后由于视图中的异常而出现错误的原因。注意到付款通过一条成功的消息表明已下订单,但随之而来的是另一条消息,A serious Error Occured. We have been notified.
该消息与付款视图中的最后一个异常有关
这是views.py:
class PaymentView(View):
def get(self, *args, **kwargs):
# order
order = Order.objects.get(user=self.request.user, ordered=False)
if order.billing_address:
context = {
'order': order,
'DISPLAY_COUPON_FORM': False
}
return render(self.request, "payment.html", context)
else:
messages.warning(
self.request, "You have not added a billing address")
return redirect("core:checkout")
# `source` is obtained with Stripe.js; see https://stripe.com/docs/payments/accept-a-payment-charges#web-create
# -token
def post(self, *args, **kwargs):
order = Order.objects.get(user=self.request.user, ordered=False)
token = self.request.POST.get('stripeToken')
amount = int(order.grand_total() * 100)
try:
charge = stripe.Charge.create(
amount=amount, # cents
currency="usd",
source=token,
)
# create payment
payment = Payment()
payment.stripe_charge_id = charge['id']
payment.user = self.request.user
payment.amount = order.grand_total()
payment.save()
# assign the payment to the order
order_items = order.items.all()
order_items.update(ordered=True)
for item in order_items:
item.save()
order.ordered = True
order.payment = payment
order.ref_code = create_ref_code()
order.save()
messages.success(self.request, "Your Order was Successful ! ")
# Email when order is made
template = render_to_string("payment_confirmation_email.html", {'first_name': self.request.user.first_name,
'last_name': self.request.user.last_name,
'order': order})
msg = EmailMessage('Thanks for Purchasing', template,
settings.EMAIL_HOST_USER, [self.request.user.email])
msg.content_subtype = "html" # Main content is now text/html
msg.fail_silently = False
msg.send()
# End of the email send
return render(self.request, "order_completed.html", {'order': order})
except stripe.error.CardError as e:
body = e.json_body
err = body.get('error', {})
messages.warning(self.request, f"{err.get('message')}")
# Since it's a decline, stripe.error.CardError will be caught
return redirect("/")
except stripe.error.RateLimitError as e:
# Too many requests made to the API too quickly
messages.warning(self.request, "Rate Limit Error")
return redirect("/")
except stripe.error.InvalidRequestError as e:
# Invalid parameters were supplied to Stripe's API
messages.warning(self.request, "Invalid Parameters")
return redirect("/")
except stripe.error.AuthenticationError as e:
# Authentication with Stripe's API failed
# (maybe you changed API keys recently)
messages.warning(self.request, "Not Authenticated")
return redirect("/")
except stripe.error.APIConnectionError as e:
# Network communication with Stripe failed
messages.warning(self.request, "Network Error")
return redirect("/")
except stripe.error.StripeError as e:
# Display a very generic error to the user, and maybe send
# yourself an email
messages.warning(
self.request, "Something went wrong. You were not charged. Please Try Again.")
return redirect("/")
except Exception as e:
# Something else happened, completely unrelated to Stripe
# send an email to ourselves
messages.warning(
self.request, "A serious Error Occured. We have been notified.")
return redirect("/")
这是models.py
class Payment(models.Model):
stripe_charge_id = models.CharField(max_length=50)
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.SET_NULL, blank=True, null=True)
amount = models.FloatField()
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.user.username
解决方案
首先,尝试打印实际消息而不是自定义消息。
messages.warning(self.request, str(e))
并修复了 try 块中发生的错误。从你的评论中知道
'block' tag with name 'head_title' appears more than once
从模板中删除重复的“head_title”块。
推荐阅读
- javascript - AJAX 调用后无法更改数据的值
- mysql - 如何同时托管 laravel 和 reactjs 应用程序
- cuda - CUDA 中的并排数组
- sql-server - 将日期列从 excel 导入 SSIS - 在 SQL 中获取长日期格式
- java - 如何保存 Java 对象和 IO
- garbage-collection - 应用切换到后台后,自定义 NSViewController 释放,释放失败
- sql - 如何在 postgresql 中插入外键列?
- c# - mysqlException 未处理 c#
- sql - Jaspersoft Studio JDBC 到 Sql Server 不喜欢日期
- sql - 按数字顺序对表格进行排序