Не удается заставить django_sendfile2 работать с gunicorn, nginx, docker
Я пишу веб-приложение для помощи пользователю в создании счетов-фактур. Мне удается создать и сохранить pdf-файлы, но я не могу заставить django_sendfile2 сохранить их.
Вот моя модель django с функцией upload_to:
def claim_path(instance, filename):
return "archive/{0}_{1}/{2}_{3}/{4}".format(
instance.guardian.last_name,
instance.guardian.first_name,
instance.patient.last_name,
instance.patient.first_name,
filename,
)
class Claim(models.Model):
patient = models.ForeignKey("Patient", on_delete=models.CASCADE)
guardian = models.ForeignKey("Guardian", on_delete=models.CASCADE)
start_date = models.DateField("Start Date")
end_date = models.DateField("End Date")
creation_date = models.DateField("Creation Date", default=datetime.now)
sum = models.IntegerField("Claim Sum")
pdf = models.FileField("Claim File", upload_to=claim_path)
Вот важные разделы файла settings.py:
INSTALLED_APPS = [
...
"django_sendfile",
...
]
# media
MEDIA_URL = "/protected/"
MEDIA_ROOT = "/protected/"
# for django_sendfile2
SENDFILE_BACKEND = "django_sendfile.backends.nginx"
SENDFILE_ROOT = "/protected/"
SENDFILE_URL = "/protected/"
вот представление, которое должно обслуживать pdf (не обращайте внимания на название, позже я хочу встроить его на сайт в качестве превью):
def show_pdf_preview(request, claim_id):
if request.user.is_authenticated:
claim = Claim.objects.get(id=claim_id)
if claim.guardian == request.user.guardian:
logging.info(f"trying to show pdf preview using filename '{claim.pdf.path}'")
return sendfile(request, claim.pdf.path)
else:
return HttpResponseForbidden
else:
return HttpResponseForbidden
Вот мой nginx default.conf:
upstream django {
server django_gunicorn:8000;
}
server {
listen 80;
location / {
proxy_pass http://django;
}
location /static/ {
alias /static/;
}
location /protected/ {
internal;
root /protected/;
}
}
И наконец, вот сообщение об ошибке, которое я получаю в stdout докера:
nginx | 2024/06/06 13:08:16 [error] 29#29: *1 open() "/protected/protected/archive/Admin_Admin/Test_Test/2024-06-06_142405.862381.pdf" failed (2: No such file or directory), client: 172.18.0.1, server: , request: "GET /show_pdf_preview/65/ HTTP/1.1", upstream: "http://172.18.0.3:8000/show_pdf_preview/65/", host: "localhost:8080", referrer: "http://localhost:8080/show_claims/"
nginx | 172.18.0.1 - - [06/Jun/2024:13:08:16 +0000] "GET /show_pdf_preview/65/ HTTP/1.1" 404 153 "http://localhost:8080/show_claims/" "Mozilla/5.0 (X11; Linux x86_64; rv:126.0) Gecko/20100101 Firefox/126.0" "-"
И да, файл существует. Я проверил его. Несколько раз. Я также уже проверил права доступа к файлу и установил их на rwxrwxrwx для тестирования. Я также пробовал использовать обратные слеши, потому что в документации django_sendfile2 упоминались ошибочные пути. Все безуспешно. Может ли кто-нибудь указать мне на мою ошибку?
Приветствия Андре