Загрузка файла после оплаты с помощью Django

#python #django #filefield

#python #django #поле файла

Вопрос:

Я создаю платформу цифровой электронной коммерции с помощью Django. Когда мои клиенты платят за цифровой продукт, я хочу, чтобы цифровой продукт загружался сразу после оплаты. Поэтому, когда они завершают платеж, они автоматически получают загруженный файл.

На данный момент после оплаты я возвращаюсь на домашнюю страницу и получаю успешный платеж. Но вместо возврата на домашнюю страницу я хочу, чтобы файл загружался после оплаты, поэтому я хочу, чтобы он отображался во что-то вроде I 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, *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()
  

Ответ №1:

Проблема с этим подходом заключается в том, что пользователь со ссылкой для скачивания может поделиться им, чтобы любой человек, имеющий ссылку, мог загрузить этот файл.

Один из способов избежать этого — перенаправить на просмотр загрузки, который возвращает файловый ответ, этот просмотр гарантирует, что пользователь аутентифицирован, затем извлекает файл, связанный с их покупкой, и возвращает файловый ответ

Таким образом, вы гарантируете, что только аутентифицированный пользователь, который заплатил за данный файл, сможет загрузить этот файл

Комментарии:

1. Пользователям не нужно ничего делиться. Эта функция предназначена для клиентов, когда они покупают цифровой продукт, цифровой продукт (например, файл csv) будет загружен автоматически после оплаты.