13 Stimmen

Wie macht man einen privaten Download-Bereich mit Django?

Ich möchte einen privaten Download-Bereich auf einer django-basierten Website einrichten. Der Benutzer müsste mit den entsprechenden Rechten eingeloggt sein, um einige statische Dateien abrufen zu können.

Was würden Sie empfehlen, um dieses Feature zu schreiben? Haben Sie Tipps oder Tricks?

Vielen Dank im Voraus

Aktualisierung: Vielleicht wegen meiner schlechten Englisch oder mein Mangel an Wissen über diese Architektur (das ist, warum ich frage), aber meine Frage ist: wie man sicherstellen, dass statische Dateien (serviert von der regulären Webserver ohne jede Notwendigkeit von django) Zugriff durch die django-Authentifizierung gesteuert wird. Ich werde die Django-Dokumente genauer lesen, aber ich erinnere mich nicht an eine Out-of-the-Box-Lösung für dieses Problem.

Update2: Mein Host-Provider erlaubt nur FastCgi.

11voto

emeryc Punkte 825

Bei der Suche fand ich cette Diskussionsstrang.

Es wurden drei Dinge genannt, die für Sie von Interesse sein könnten.

Zunächst gibt es die mod_python Methode
Dann gibt es noch die mod_wsgi Methode

Beides scheint nicht so toll zu sein.

Besser ist der X-Sendfile-Header, der nicht vollständig standardisiert ist, aber zumindest mit Apache und Lighttpd funktioniert.

Kibbitzing von aquí haben wir das Folgende.

@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>

und das sollte fast genau das sein, was Sie wollen. Vergewissern Sie sich nur, dass Sie die X-Sendfile-Unterstützung in dem Programm, das Sie verwenden, aktivieren.

3voto

luc Punkte 39730

Das XSendfile scheint der richtige Ansatz zu sein, aber die Einrichtung scheint etwas kompliziert zu sein. Ich habe beschlossen, einen einfacheren Weg zu verwenden.

Basierend auf emeryc Antwort und django Schnipsel http://www.djangosnippets.org/snippets/365/ Ich habe den folgenden Code geschrieben und er scheint das zu machen, was ich will:

@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')

1voto

marcc Punkte 12229

Es gibt tonnenweise Tutorials, wie man die Authentifizierung in Django aktiviert. Brauchen Sie Hilfe dabei? Wenn ja, dann beginnen Sie aquí .

Der nächste Schritt besteht darin, eine Ansicht zu erstellen, in der Ihre Dateien aufgelistet sind. Tun Sie das, das ist alles grundlegende Django. Wenn Sie Probleme mit diesem Schritt haben, gehen Sie zurück und gehen Sie die Django-Tutorial . Sie werden das hier bekommen.

Zum Schluss verweisen wir noch einmal auf den ersten Link (hier ist er noch einmal: Authentifizierungsdokumente ) und sehen Sie sich den Dekorator LOGIN_REQUIRED genau an. Schützen Sie Ihre Ansicht mit diesem Dekorator.

Dies ist alles ziemlich grundlegende Django Zeug. Wenn Sie dies getan haben und eine spezifisch Frage haben, stellen Sie sie hier. Aber Sie haben eine ziemlich offene Frage an SO gestellt, und das ist kein guter Weg, um Hilfe zu bekommen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X