2009-04-08 12 views
9

Tengo una aplicación django que usa mod_python, una configuración bastante típica, excepto que los archivos multimedia están siendo servidos por un directorio de "medios" (lo sé, no recomendado) en la raíz del documento. Me gustaría probar y quizás implementar con mod_wsgi pero no puedo encontrar la manera de crear algo simple para servir archivos estáticos. mod_python permite el uso de directivas de Apache como:Sirviendo archivos estáticos con mod_wsgi y Django

<Location '/'> 
    SetHandler MyApplication.xyz..... 
</Location> 

<Location '/media'> 
    SetHandler None 
</Location> 

El Django documentos parecen apuntar al segundo bloque anterior como la forma correcta de hacer una excepción similar para mod_wsgi, pero en mis pruebas todo por debajo de la raíz sigue siendo enviado a la aplicación wsgi. ¿Hay una buena manera de configurar un directorio de medios estáticos con mod_wsgi, o es lo que estoy tratando de hacer intencionalmente sin soporte por razones técnicas convincentes? Las respuestas que apuntan a enfoques completamente diferentes son bienvenidas.

Respuesta

13

La documentación de mod_wsgi explica cómo configurar los archivos estáticos que aparecen en una URL debajo de la que está montada la aplicación WSGI. Ver:

http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#Hosting_Of_Static_Files

Tenga en cuenta que 'Opciones + ExecCGI' no se necesitan cuando se utiliza la directiva WSGIScriptAlias ​​para montar la aplicación WSGI. La opción 'ExecCGI' solo es necesaria cuando se usa AddHandler para montar aplicaciones como recursos.

+0

¡Graham Dumpleton! Gracias por mod_wsgi! En realidad, creo que originalmente el orden era el problema, no usé la directiva cgi. Su módulo me ha permitido hacer un montón de cosas, realmente he desarrollado un hábito de mod_wsgi desde que hice esta pregunta. – unmounted

+1

Doble gracias por la documentación. Los mejores documentos que he visto en mucho tiempo. ¡Ojalá MÁS personas las lean! – htmldrum

17

Ejecuto una docena de sitios de Django en el mismo servidor y así es como configuro las URL de los medios.

Cada host virtual tiene la siguiente configuración:

Alias /media /path/to/media/ 
<Directory /path/to/media> 
    Include /etc/apache2/vhosts.d/media.include 
</Directory> 

De esta manera puedo realizar ningún cambio en el manejo de los medios de comunicación en un solo archivo.

Entonces, mi archivo media.include se parece a esto:

Order allow,deny 
Allow from all 
SetHandler None 
FileETag none 
Options FollowSymLinks 

<IfModule mod_expires.c> 
    ExpiresActive On 
    ExpiresByType image/gif "access plus 30 days" 
    ExpiresByType image/jpg "access plus 30 days" 
    ExpiresByType image/png "access plus 30 days" 
    ExpiresByType image/jpeg "access plus 30 days" 
    ExpiresByType text/css "access plus 30 days" 
    ExpiresByType application/x-javascript "modification plus 2 years" 
</IfModule> 

<IfModule mod_headers.c> 
    Header append Vary Accept-Encoding 
</IfModule> 

AddOutputFilterByType DEFLATE text/html text/css text/plain 

Esto ha funcionado muy bien para mí, y obtiene un Una calificación deYSlow (véase también Jeff Atwood on YSlow).

También tenga en cuenta, para el directorio raíz utilizo la siguiente configuración:

WSGIScriptAlias//path/to/app.wsgi 
<Directory /path/to> 
    Options +ExecCGI 
    Allow from all 
</Directory> 

... que debe ser después el alias/medios de comunicación en el archivo de configuración (porque Apache mira a los alias con el fin)

+0

Para su directorio raíz: Es súper cinturón y llaves, pero desde un punto de vista de seguridad, colocaría una sección dentro de su y movería su "Permitir de todos" allí. – Cheekysoft

Cuestiones relacionadas