Подтвердить что ты не робот

Как вы требуете входа в медиафайлы в Django

Я обслуживаю "чувствительную" информацию в загружаемых PDF и электронных таблицах в разделе регистрации пользователя на сайте.

Есть ли способ разрешить django-аутентификацию для защиты этого носителя без, обслуживающего его (и не нужно вручную вводить пароль, используя базовый auth)?

Я предполагаю, что theres (скрещенные пальцы) не способ сделать это с помощью кода psuedo ниже, но это помогает лучше проиллюстрировать конечную цель.

#urls.py
(r'^protected_media/(?P<filename>.*)$', 'protected_media')

#views.py
from django.contrib.auth.decorators import login_required

@login_required
def protected_media(request, filename):
    # @login_required bounces you out to the login url
    # if logged in, serve "filename" from Apache
4b9b3361

Ответ 1

Мне кажется, что метод, который вы указали в коде, должен работать. Это действительно ничем не отличается от любого другого защищенного ресурса: ваши представления могут обслуживать файлы с дисков, записи из баз данных, отображаемые шаблоны или что угодно. Подобно тому, как декодер 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.)

EDIT 2: Что касается кода для обслуживания файла, см. этот фрагмент:

В методе send_file используется FileWrapper, который хорош для отправки больших статических файлов (он не считывает весь файл в память). Вам нужно будет изменить content_type в зависимости от типа отправляемого файла (pdf, jpg и т.д.).

Ответ 2

Прочтите этот билет Django для получения дополнительной информации. Начните снизу, чтобы сэкономить некоторое время. Похоже, он просто пропустил попадание в Django 1.2, и я предполагаю, что это также не в 1.3.

Для Nginx я нашел этот фрагмент Django, который использует заголовок X-Accel-Redirect, но еще не пробовал его.

Ответ 3

Более эффективная загрузка статических файлов через Django рассматривается в настоящее время как часть проекта Google SOC. Для WSGI это будет использовать расширения wsgi.file_wrapper для WSGI, если они доступны, как и для mod_wsgi, и req.sendfile() при использовании mod_python. Он также будет поддерживать возврат заголовков, таких как "Местоположение", "X-Accel-Redirect" и другие, которые различные механизмы веб-хостинга и интерфейсы прокси-сервера принимают в качестве средства обслуживания статических файлов, где местоположение определяется веб-приложением, что не так эффективно, как интерфейс для обслуживания статических файлов.

Я не уверен, есть ли страница проекта для этого в Django-вики где-то или нет, но изменения кода передаются в ветку веток /soc 2009/http-wsgi-updates репозитория исходного кода Django.

Вам не нужно строго ждать этого. Он просто устанавливает чистый и портативный интерфейс на разных механизмах. Если вы используете nginx в качестве переднего конца перед Apache/mod_wsgi, теперь вы можете использовать X-Accel-Redirect. Если вы используете режим Apache/mod_wsgi 3.0 и daemon, теперь вы можете использовать "Местоположение", но вам нужно убедиться, что вы правильно настроили Apache. Кроме того, вы можете реализовать свою собственную оболочку промежуточного ПО WSGI вокруг приложения Django, которая ищет собственный собственный заголовок ответа, чтобы указать файл, который будет возвращен, и который использует wsgi.file_wrapper для возврата, вместо фактического ответа, возвращаемого из Django.

BTW, механизмы проверки подлинности, перечисленные для mod_python и mod_wsgi другими, будут использовать базовую аутентификацию HTTP, чего вы не хотите. Предполагается, что вы хотите, чтобы файлы были защищены механизмом входа в форму на основе Django, используя куки файлы и серверные сессии.

Ответ 4

Если я правильно понял ваш вопрос, вы хотите ограничить доступ к файлам, которые не обслуживаются Django, например, с сервером Apache?

То, что вам тогда понадобилось, - это какой-то способ для этого сервера Apache использовать Django в качестве источника аутентификации.

Этот фрагмент django описывает такой метод. Он создает обработчик доступа в Django, который используется Apache, когда требуется запрос на статический файл, который должен быть защищен:

<Location "/protected/location">
            PythonPath "['/path/to/proj/'] + sys.path"  
            PythonOption DJANGO_SETTINGS_MODULE myproj.settings
        PythonOption DjangoPermissionName '<permission.codename>'
        PythonAccessHandler my_proj.modpython #this should point to accesshandler
            SetHandler None
</Location>

Надеюсь, что это поможет, фрагмент был опубликован некоторое время назад, поэтому все может измениться между версиями Django:)