Как автоматически назначить тип содержимого при обслуживании файла в Django

У меня есть система, в которой для просмотра файлов требуются определенные разрешения, и я использую django-guardian для разрешений. Я хочу, чтобы файл отображался в новой вкладке, если браузер поддерживает это, иначе просто загрузите файл.

Я могу проверить имя файла и вручную установить тип содержимого в зависимости от расширения файла, но их слишком много, и это кажется глупым занятием. Вот вид:

@login_required
def ViewDocument(request, document_id):
    document = Document.objects.get(id=document_id)
    path = document.file.name
    # Check user permissions to view file
    if not request.user.has_perm('home.view_document', document):
        return HttpResponseForbidden("You don't have permission to access this media.")

    # Construct the full path to the media file
    media_path = os.path.join(settings.MEDIA_ROOT, path)

    # can i do this more easily?
    if path.endswith('.pdf'):
        temp_content_type = "application/pdf"
    elif path.endswith('.png'):
        temp_content_type = "image/png"
    elif path.endswith('.jpg'):
        temp_content_type = "image/jpeg"
    else:
        temp_content_type = "application/octet-stream"

    # Serve the file
    with open(media_path, 'rb') as file:
        response = HttpResponse(file.read(), content_type=temp_content_type)

    return response

Используйте FileResponse объекты Django для обслуживания файла. Все nitty-gritty будет обработано за вас под капотом.

return FileResponse(open(media_path, 'rb'))[1]
  • Заголовок Content-Length автоматически устанавливается, если он может быть определен из содержимого open_file.
  • Заголовок Content-Type автоматически устанавливается, если он может быть угадан из filename или имени open_file.

Нет необходимости в многочисленных if утверждениях, чтобы определить их.


[1] The file will be closed automatically, so don’t open it with a context manager. Give FileResponse an open file.

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