Не удается заставить 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 упоминались ошибочные пути. Все безуспешно. Может ли кто-нибудь указать мне на мою ошибку?

Приветствия Андре

Вернуться на верх