Heroku django "файл не существует", когда я пытаюсь загрузить его с сервера

Я успешно развернул свое приложение на сервере heroku, но столкнулся с такой проблемой, когда я пытаюсь загрузить файл (например, с помощью <a href="{{object.file.url}}">Download</a>) django возвращает "Страница не найдена" с ошибкой "файл 'app/.../.../{file}' не существует" ("app" - это не настоящее имя приложения. Я не знаю, откуда оно взялось). Другие статические файлы (например, с href="{% static "path/to/file" %}") работают отлично. То же самое в админ панели, когда я перехожу к экземпляру модели, который хранит путь к файлу - путь отображается, но оттуда ничего не скачивается. Что мне делать?

Я нашел решение своей проблемы. Необходимо было уточнить выше: Мне не нужен полноценный отдельный сервер для медиафайлов, как AWS S3 и т.д., потому что мой проект - всего лишь демо. Это не рабочий проект, поэтому мне нужно было решить проблему таким образом, чтобы остаться с локальным хранилищем heroku. Я решил эту проблему: я написал представление, которое возвращает файл через FileResponce.

Код:

# views.py
# ... necessary imports

class Download(View):
    def get(self, request, *args, **kwargs):
        file_name = self.kwargs.get('file_name')
        username = self.kwargs.get('username')
        file_path = os.path.join(settings.BASE_DIR, 'media', 'documents', f'user_{username}', file_name)
        if os.path.exists(file_path):
            return FileResponse(open(file_path, 'rb'))
        raise Http404
# urls.py

urlpatterns = [
    ...,
    path('download/<str:username>/<str:file_name>', Download.as_view(), name='graduateWork/download'),
    ...,

# templatetags/file_name.py
from django import template


register = template.Library()


@register.filter
def get_file_name(fl: str):
    return fl.split('/')[-1]
<a class='btn btn-success' style='text-decoration: none; color: white;' href="{% url 'graduateWork/download' username=document.publisher.username file_name=document.file.name|get_file_name %}">
    Скачать <img src="{% static 'download.png' %}" height='20px;' alt="скачать">
</a>

Если вы хотите остаться с локальным хранилищем heroku, как я, используйте это решение.

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