Я хотел бы реализовать частную область загрузки на веб-сайте, на котором работает 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, и это не отличный способ получить помощь.