【问题标题】:Download file after payment with Django使用 Django 付款后下载文件
【发布时间】:2021-01-31 19:34:21
【问题描述】:

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

现在付款后,我将返回主页并成功付款。但是,我不想渲染回主页,而是希望在付款后下载文件,所以我想渲染成类似我return redirect( {{item.file.url}} ) 而不是return redirect("/" ) 的东西(参见视图的最后一行)。我在 Views and Models 中的代码如下:

观看次数

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, *args, **kwargs):
          order = Order.objects.get(user=self.request.user, 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()

【问题讨论】:

    标签: python django filefield


    【解决方案1】:

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

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

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

    【讨论】:

    • 用户不必分享任何东西。此功能适用于客户购买数码产品时,付款后会自动下载数码产品(例如csv文件)。
    猜你喜欢
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2020-09-21
    相关资源
    最近更新 更多