Джанго: предотвращение прямого доступа к файлам - PullRequest
4 голосов
/ 10 октября 2010

Я хочу обслуживать файлы динамически из-за корня моего веб-каталога.В настоящее время я обслуживаю все файлы статически, что я и сделал для того, чтобы включить мои javascripts и css файлы.Я понимаю, что это, вероятно, глупо, но я не могу обслуживать файлы другим способом!

Итак, я хочу обслуживать файлы динамически, без возможности доступа пользователя в другое время, просто используя URL.1003 *

Мои настройки

ADMIN_MEDIA_PREFIX = '/media/'
MEDIA_ROOT = os.path.join( APP_DIR, 'site_media' )
MEDIA_URL = 'http://localhost:8000/site_media/'

Мои URL-адреса

( r'^site_media/(?P<path>.*)$', 'django.views.static.serve', { 'document_root': settings.MEDIA_ROOT } )

Спасибо!

Ответы [ 2 ]

5 голосов
/ 10 октября 2010

Что вы подразумеваете под «динамически»? Чего ты хочешь достичь? Вы хотите контролировать доступ к файлам?

Если вы хотите запустить Django-view, который решает, разрешен ли пользователю доступ к файлу или нет, вы можете использовать sendfile. В следующем фрагменте кода приведен код установки правильных заголовков: http://djangosnippets.org/snippets/2226/

Ваш веб-сервер также должен поддерживать этот заголовок, по крайней мере apache и nginx, с которыми я работал.

Вам также необходимо подумать о том, как хранить и распространять файлы, поскольку серверу, на котором работает веб-сервер, необходим доступ к файлам. Это будет зависеть от вашей настройки.

1 голос
/ 11 октября 2010

Вы можете запутать URL-адреса таким образом, что их будет довольно сложно угадать; это совсем не безопасно, но это остановит случайного покера. Вам также необходимо убедиться, что все, что вы используете для обслуживания статических носителей в производстве, не настроено на отображение списков каталогов.

Если вам нужно что-то более безопасное, вот что я делал в прошлом:

In models.py:

my_storage = FileSystemStorage(location=settings.MY_FILES_ROOT, base_url='DO_NOT_USE')

class Resource (models.Model):
    //...snip...
    resource_file = models.FileField(storage = my_storage)

где settings.MY_FILES_ROOT - это путь вне того места, где вы обычно храните статические файлы.

Тогда в views.py:

def get_file(request, whatever_id):
    //check if the user is allowed to access the file here
    resource = Resource.objects.get(id=resid)
    response = HttpResponse(resource.resource_file.read(), mimetype='text/whatever')
    response['Content-Disposition'] = 'attachment; filename=whatever.ext'
    return response

Конечно, этот подход работает только в том случае, если вы знаете тип MIME и расширение файла, независимо от того, всегда ли он одинаков (приложение, в котором я делал это, всегда обслуживал PDF-файлы) или вы извлекаете его из файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...