2014-07-08 16 views
5

Ho il mio django servito da apache utilizzando Vhost. Il file di configurazione è la seguenteXsendFile con apache e 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> 

voglio limitare i file multimediali ad essere servita solo su speicific registrati utenti. Quindi mi sono imbattuto in XsendFile. Se capisco correttamente che cosa fa mentre tu hai django fai tutto il controllo per il file multimediale che vuoi servire è poi servito da Apache come file statico. Quindi la procedura è il seguente se sto indovinando giusto

  1. Attivare XsendFile.
  2. CREATE VIEW che controlla per i file multimediali permessi ecc e serve loro
  3. associato con l'URL nel file di urls.py

Quindi posso usare `e lavorerò normalmente come se fosse servito utilizzando l'iniziale URL del file multimediale. Lo capisco correttamente? Le mie domande sono le seguenti:

Informazioni su 1.activating XSendFile. Dovrebbe essere fatto nel file conf all'interno del mio tag Vhost? L'impostazione di XsendFile è sufficiente? Devo rimuovere Alias ​​per la direttiva media e anche la sezione per i file multimediali? Voglio che i file multimediali vengano visualizzati solo dalla mia visualizzazione?

C'è qualcos'altro di cui dovrei essere a conoscenza?

Edit: La mia configurazione è

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

mia urls.py

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

e la mia vista

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 

Il mio problema è che alcuni dei file multimediali sono condivisi normalmente e alcuni non lo sono e ottengono un errore interno del server

+0

Cosa intendi con "alcuni file multimediali sono condivisi normalmente e altri no"? Potresti spiegarlo un po 'di più? Stai usando il decoratore personale_member_qualificato? – vsachar

risposta

4

Assicuratevi anche di impostare il XSendFilePath nel file di configurazione di Apache in questo modo,

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

e includere questo nella vostra vista mentre restituendo la risposta:

risposta [ 'X- sendfile '] = smart_str (percorso_file)

E per rispondere alle vostre domande:

  • Attivare il XSendFile nel tag vhost
  • ho scritto sopra che altro deve essere fatto nella vista
  • non sono sicuro se è necessario rimuovere l'alias dei media, i file di log dovrebbero dire tu se averli è un problema
+0

Cosa dovrei impostare come valore di XSendFilePath? Se lascio l'Alias ​​per i media, gli utenti non potranno accedere ai file multimediali se inserendo il percorso nell'URL? ad esempio www.mydomain.com/media/path_to_mediafile – Apostolos

+0

Non penso che sia una possibilità a meno che tu non abbia l'URL/media nella tua urls.py. Ho aggiornato la risposta sopra per rispondere alla tua domanda. – vsachar

+0

Ho seguito questo link qui (http://goo.gl/HKYEvt). Modificato anche il mio post initaliano – Apostolos