用Django付款后下载文件

问题描述

我正在使用Django构建数字电子商务平台。当我的客户购买数字产品时,我希望在付款后立即下载数字产品。因此,当他们完成付款后,就会自动下载文件

目前,付款后,我将返回首页并成功付款。但是,我不想渲染回主页,而是希望在付款后下载文件,所以我想渲染为类似return redirect( {{item.file.url}} )的格式,而不是return redirect("/" )(请参见视图的最后一行)。我在“视图和模型”中的代码如下:

观看次数

class PaymentView(View):
     def get(self,*args,**kwargs):
          order = Order.objects.get(user=self.request.user,ordered=False)
          context = {
               'order': order
          }
          return render(self.request,'dashtemplates/payment.html',context)

     def post(self,ordered=False)
          token = self.request.POST.get('stripetoken')
          amount = int(order.get_total() * 100)

          try:
               charge = stripe.Charge.create(
                    amount=amount,currency="usd",source=token
               )

               #create payment
               payment = Payment()
               payment.stripe_charge_id = charge['id']
               payment.user = self.request.user
               payment.amount = order.get_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.save()

               messages.success(self.request,"Your order was succesful!")
               return redirect("/" )

模型

class Item(models.Model):
    title = models.CharField(max_length=100)
    price = models.FloatField()
    category = models.CharField(choices=CATEGORY_CHOICES,max_length=20)
    slug = models.SlugField()
    description = models.TextField()
    image = models.ImageField()
    file = models.FileField()

解决方法

此方法的问题在于,具有下载链接的用户可以共享它,因此具有链接的任何人都可以下载该文件。

避免这种情况的一种方法是重定向到返回一个FileResponse的下载视图,该视图将确保用户通过身份验证,然后检索链接到其购买的File并返回FileResponse

这样,您可以确保只有为给定文件付费的经过身份验证的用户才能下载该文件