Как сделать приватную область загрузки с django? - PullRequest
10 голосов
/ 22 октября 2009

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

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 23 октября 2009

Итак, при поиске я нашел эту ветку обсуждения.

Было сказано, что вас могут заинтересовать три вещи.

Сначала идет метод 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 во всем, что вы используете.

3 голосов
/ 26 октября 2009

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')
1 голос
/ 22 октября 2009

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

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

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

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

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