Django Content-Disposition работает не так, как ожидалось

Я пытаюсь создать функциональность с помощью Django, Gunicorn и Nginx, где пользователь может запросить загрузку pdf, указав свой email, после чего на его email будет отправлена пользовательская ссылка для загрузки. Нажатие на пользовательскую ссылку должно побудить пользователя загрузить pdf. Однако я постоянно получаю ошибку "Страница не найдена".

Ниже приведен мой файл models.py:

from django.db import models
import string
import random

class BrochureToken(models.Model):
    email = models.EmailField(blank=True)  
    token = models.CharField(max_length=20, unique=True)  # Random token
    is_used = models.BooleanField(default=False)  # Flag to track if the token has been used

    def generate_token(self):
        length = 20
        chars = string.ascii_letters + string.digits
        self.token = ''.join(random.choice(chars) for _ in range(length))

    def save(self, *args, **kwargs):
        # Generate token before saving if it's not already set
        if not self.token:
            self.generate_token()
        super().save(*args, **kwargs)

    def __str__(self):
        return self.email

Ниже приведен мой файл views.py:


class BrochreRequest(generics.CreateAPIView):
    queryset = BrochureToken.objects.all()
    serializer_class = BrochureSerializers
    permission_classes = (permissions.AllowAny,)

    def post(self, request, format=None):

        serializer = BrochureSerializers(data=request.data)

        if serializer.is_valid():
            print("Serializer is valid")
            serializer.save()
            email = request.data.get("email")
            token, created = BrochureToken.objects.get_or_create(defaults={'email': email})
            download_link = f'https://api.mysite.com/api/filedownload/brochure/{token.token}'
          

            send_mail(
            'Download The OIC Brochure',
            f'Click the link to download the brochure: {download_link}',
            settings.EMAIL_HOST_USER,
            [email],
            fail_silently=False
        )
            return Response(serializer.data, status = status.HTTP_200_OK)
        else:
            return Response(serializer.errors, status = status.HTTP_400_BAD_REQUEST)



def brochure_download_view(request, token):
    download_token = get_object_or_404(BrochureToken, token=token)
    if not download_token.is_used:
        download_token.is_used = True
        download_token.save()

        # Set the file path to your actual PDF location
        file_path = 'https://api.mysite.com/media/pdfs/oic_brochure.pdf'
    

        try:
            with open(file_path, 'rb') as f:
                response = FileResponse(f, content_type='application/pdf')
                response['Content-Disposition'] = f'attachment; filename=oic_brochure.pdf'
                return response
        except FileNotFoundError:
            raise Http404("File not found")
        except SuspiciousFileOperation as e:
            raise PermissionError(f"Error opening file: {e}")
        except Exception as e:
            # Log unexpected errors for debugging
            logger.error(f"Unexpected error during file download: {e}")
            return HttpResponse("Internal server error", status = status.HTTP_500_INTERNAL_SERVER_ERROR)

Ниже приведен мой файл urls.py:

from django.urls import path
from .views import brochure_download_view, BrochreRequest

app_name = 'filedownloads'

urlpatterns = [
    path('brochure/<str:token>', brochure_download_view, name="brochure"),
    path('brochure/', BrochreRequest.as_view()),
]
Вернуться на верх