Как сделать частную область загрузки с django?

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

Что вы рекомендуете для написания этой функции. Любые советы или рекомендации?

Заранее спасибо

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

Update2: Мой хост-провайдер разрешает только FastCgi.

Ответ 1

Итак, поиск я нашел этот дискуссионный поток.

Было три вещи, которые, возможно, вас заинтересуют.

Сначала существует метод mod_python
Затем существует метод mod_wsgi

Оба из них не кажутся такими замечательными.

Лучше заголовок X-Sendfile, который не является полностью стандартным, но работает как минимум в apache и lighttpd.

kibbitzing из здесь, мы имеем следующее.

@login_required
def serve_file(request, context):
    if <check if they have access to the file>:
        filename = "/var/www/myfile.xyz" 
        response = HttpResponse(mimetype='application/force-download') 
        response['Content-Disposition']='attachment;filename="%s"'%filename
        response["X-Sendfile"] = filename
        response['Content-length'] = os.stat("debug.py").st_size
        return response
    return <error state>

и это должно быть почти точно, что вы хотите. Просто убедитесь, что вы включили поддержку X-Sendfile во всем, что бы вы ни использовали.

Ответ 2

XSendfile, кажется, правильный подход, но он выглядит немного сложным для настройки. Я решил использовать более простой способ.

На основе ответов emeryc и фрагментов django http://www.djangosnippets.org/snippets/365/, я написал следующий код и, похоже, делает то, что хочу:

@login_required
def serve_file(request, filename):
    fullname = myapp.settings.PRIVATE_AREA+filename
    try:
        f = file(fullname, "rb")
    except Exception, e:
        return page_not_found(request, template_name='404.html')
    try:
        wrapper = FileWrapper(f)
        response = HttpResponse(wrapper, mimetype=mimetypes.guess_type(filename)[0])
        response['Content-Length'] = os.path.getsize(fullname)
        response['Content-Disposition'] = 'attachment; filename={0}'.format(filename)
        return response
    except Exception, e:
        return page_not_found(request, template_name='500.html')

Ответ 3

Там тонны учебников о том, как включить аутентификацию в Django. Вам нужна помощь? Если это так, запустите здесь.

Следующий шаг - создать представление, в котором перечислены ваши файлы. Так и сделайте это, это все базовое Django. Если у вас есть проблемы с этим шагом, вернитесь и просмотрите учебник по Django. Вы получите это.

Наконец, вернитесь к первой ссылке (здесь снова: документы проверки подлинности) и внимательно посмотрите на декоратор LOGIN_REQUIRED. Защитите свой вид с помощью этого декоратора.

Это все довольно простой материал Django. Если вы сделали это и задали конкретный вопрос, разместите его здесь. Но вы положили довольно открытый вопрос на SO, и это не отличный способ получить помощь.