Мне кажется, что метод, который вы описали в своем коде, должен работать. Он действительно ничем не отличается от любого другого защищенного ресурса: ваши представления могут обслуживать файлы с дисков, записи из баз данных, визуализированные шаблоны или что-либо еще. Так же, как декоратор login_required предотвращает несанкционированный доступ к другим представлениям, он предотвращает такой доступ к вашему представлению, обслуживающему защищенные носители.
Я что-то упустил из вашего вопроса здесь? Пожалуйста, уточните, если это так.
РЕДАКТИРОВАТЬ: Что касается ссылки django doc в вашем комментарии: это метод простого обслуживания любого файла запроса из определенного каталога. Таким образом, в этом примере URL-адреса, такие как /site_media/foo.jpg
, /site_media/somefolder/bar.jpg
будут автоматически искать файлы foo.jpg
и somefolder/bar.jpg
в document_root
. По сути, каждая вещь в document_root
будет общедоступной. Это явно небезопасно. Таким образом, вы избегаете этого своим методом.
Это также считается неэффективным, потому что django просто добавляет много ненужных накладных расходов, когда все, что вам нужно, это что-то вроде Apache, чтобы принять запрос URL и сопоставить его с файлом на жестком диске. (Вам не нужны сессии django, обработка запросов и т. Д.)
В вашем случае это может быть не такой большой проблемой. Во-первых, вы обеспечили вид. Во-вторых, это зависит от ваших моделей использования. Сколько запросов вы ожидаете для этих файлов? Вы используете только django для аутентификации - это оправдывает другие издержки? Если нет, вы можете посмотреть, как эти файлы обслуживать Apache и использовать поставщика аутентификации. Подробнее об этом см. Документацию mod_wsgi
:
Есть аналогичные механизмы, доступные под mod_python
Я полагаю. (Обновление: только что заметил другой ответ. Пожалуйста, смотрите ответ Андре для метода mod_python
.)
РЕДАКТИРОВАТЬ 2: Что касается кода для передачи файла, пожалуйста, посмотрите этот фрагмент:
Метод send_file
использует FileWrapper, который хорош для отправки больших статических файлов обратно (он не читает весь файл в память). Вам нужно будет изменить content_type
в зависимости от типа отправляемого файла (pdf, jpg и т. Д.).