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()),
]