2014-07-08 10 views
5

Ich habe meine Django von Apache mit Vhost bedient. Die Conf-Datei ist die folgendeXsendFile mit Apache und Django

WSGIPythonPath /srv/www/myproject/testproject/ 


<VirtualHost *:80> 
    ServerAdmin [email protected] 
    ServerName www.betarhombus.com 
    WSGIScriptAlias//srv/www/testproject/testproject/testproject/wsgi.py 
    <Directory /srv/www/testproject/testproject/testproject> 
     <Files wsgi.py> 
      Require all granted 
     </Files> 
    </Directory> 
    Alias /static/ /srv/www/testproject/testproject/static/ 
    Alias /media/ /srv/www/testproject/testproject/media/ 

    <Directory /srv/www/testproject/testproject/static> 
     Require all granted 
    </Directory> 
    <Directory /srv/www/testproject/testproject/media> 
     Require all granted 
    </Directory> 

</VirtualHost> 

ich auf Mediendateien beschränken wollen nur serviert auf speicific loggten Kunden möglich. Also bin ich auf XsendFile gestoßen. Wenn ich es richtig verstehe, was es tut, ist, während du Django hast, die ganze Prüfung für die Mediendatei zu machen, die du liefern willst, wird es dann von Apache als statische Datei bedient. Also die Prozedur ist die folgende, wenn ich richtig rate

  1. XsendFile aktivieren.
  2. Ansicht erstellen, die für die Mediendateien Berechtigungen überprüft usw. und dient ihnen
  3. assoziieren mit url in urls.py Datei

Dann kann ich `verwenden und werden in der Regel wie funktionieren, wenn es unter Verwendung der ursprünglichen serviert wurde Mediendatei-URL Verstehe ich es richtig? Meine Fragen sind die folgenden:

Über 1.activating XSendFile. Sollte dies in der Conf-Datei in meinem Vhost-Tag geschehen? Ist das Setzen von XsendFile ausreichend? Sollte ich die Alias ​​für die Medienrichtlinie und auch den Abschnitt für die Mediendateien entfernen? Ich möchte, dass Mediendateien nur von meiner Ansicht geliefert werden?

Gibt es noch etwas, auf das ich achten sollte?

Edit: Mein Setup ist

<VirtualHost *:80> 
    ServerAdmin [email protected] 
    ServerName www.betarhombus.com 
    WSGIScriptAlias//srv/www/testproject/testproject/testproject/wsgi.py 
    XSendFile On 
    XsendFilePath /srv/www/testproject/testproject/media/ 
    <Directory /srv/www/testproject/testproject/testproject> 
     <Files wsgi.py> 
      Require all granted 
     </Files> 
    </Directory> 
    Alias /static/ /srv/www/testproject/testproject/static/ 
    <Directory /srv/www/testproject/testproject/static> 
     Require all granted 
    </Directory> 
</VirtualHost> 

mein urls.py

#for xsendmedia file serving 
url(r'^media\/(?P<path>.*)$', 'customer.views.media_xsendfile'), 

und meiner Ansicht

def media_xsendfile(request, path): 
    #here will be checked if user can access media 
    response = HttpResponse() 
    response['Content-Type']='' 
    response['X-Sendfile']= smart_str(os.path.join(settings.MEDIA_ROOT, path)) 
    return response 

Mein Problem ist, dass einige der Mediendateien ist geteilt normal und einige sind nicht, und erhalten einen internen Serverfehler

+0

Was meinst du mit 'einige der Mediendateien werden normalerweise geteilt und einige sind nicht '? Könntest du es ein wenig mehr erklären? Verwenden Sie den staff_member_required Decorator? – vsachar

Antwort

4

Auch wie so stellen Sie sicher, dass die XSendFilePath in der Apache-Konfigurationsdatei setzen,

XSendFile on 
XSendFilePath "//path/to/files/on/disk" 
<Directory "//path/to/files/on/disk"> 
    Order Deny,Allow 
    Allow from all 
</Directory> 

und nimmt diese in Ihrer Ansicht nach, während die Antwort zurückgibt:

Reaktion [ 'X- sendfile '] = smart_str (file_path)

Und Ihre Fragen zu beantworten:

  • Aktivieren Sie die XSendFile im vHost Tag
  • ich oben geschrieben habe, was sonst noch in der Ansicht getan werden muss
  • Ich bin nicht sicher, ob Sie die Medien alias entfernen sollten, sollten die Protokolldateien sagen Sie, wenn sie ein Problem haben
+0

Was sollte ich als Wert für XSendFilePath festlegen? Wenn ich den Alias ​​für Medien belasse, können Benutzer nicht auf Mediendateien zugreifen, wenn sie den Pfad in der URL eingeben? Zum Beispiel: http://www.mydomain.com/media/path_to_mediafile – Apostolos

+0

Ich glaube nicht, dass dies eine Möglichkeit ist, es sei denn, Sie haben die URL/media in Ihrer URLs.py. Ich habe die obige Antwort aktualisiert, um Ihre Frage zu beantworten. – vsachar

+0

Ich folgte diesem Link hier (http://goo.gl/HKYEvt). Bearbeitet meine ursprüngliche Post auch – Apostolos