2012-02-29 24 views
41

Permítanme agradecerles a todos ustedes en la comunidad de Stack Overflow por ayudarme con varios errores de Django y Apache (con mod_wsgi). Hasta ahora, he preguntado acerca de 5 preguntas relacionadas y ahora estoy cada vez más cerca de sacar mi contenido en un sitio de producción.Apache no está sirviendo archivos django admin static

así que sé que hay muchas preguntas similares acerca de esto y han leído un bunchofquestionsaboutservingstaticmediafilesonDjango.

leí sobre STATIC_URL, STATIC_ROOT, el (que pronto será obsoleta) ADMIN_MEDIA_PREFIX, y el establecimiento de un Alias /media/ ... en la configuración de Apache. Traté de probar cada solución una por una, pero no pude hacer que funcionara nada.

Aquí es lo que mi sitio de administración se parece en este momento

También estoy teniendo un caso raro donde cualquier subdominio funciona en mi servidor. Por ejemplo, estaba intentando configurar mi servidor para que http://www.satoshi.example.com/ permitiera mi contenido normal (que no sea de Django), mientras que http://django.satoshi.example.com/ permitiría que mi contenido de Django fuera servido. Pero actualmente cualquier subdominio, ya sea satoshi.example.com o blahblahasdas.satoshi.example.com, está sirviendo mis archivos Django (lo sé porque puedo ir a la página /admin en ambos sitios, aunque estarán en diferentes sesiones).

De todos modos aquí están mis archivos en el servidor que está ejecutando CentOS (no estoy seguro de qué versión), Apache 2.2.15, Python 2.6.6, django 1.3.1 y mod_wsgi 3.2.

voy a publicar lo que pienso es los archivos y la configuración más relevantes a continuación:

Apache lanza estos errores cada vez que reinicio

[Wed Feb 29 01:45:36 2012] [error] Exception KeyError: KeyError(140249420548064,) in <module 'threading' from '/usr/lib64/python2.6/threading.pyc'> ignored 
[Wed Feb 29 01:45:36 2012] [error] Exception KeyError: KeyError(140249420548064,) in <module 'threading' from '/usr/lib64/python2.6/threading.pyc'> ignored 
[Wed Feb 29 01:45:36 2012] [error] Exception KeyError: KeyError(140249420548064,) in <module 'threading' from '/usr/lib64/python2.6/threading.pyc'> ignored 
[Wed Feb 29 01:45:36 2012] [error] Exception KeyError: KeyError(140249420548064,) in <module 'threading' from '/usr/lib64/python2.6/threading.pyc'> ignored 
[Wed Feb 29 01:45:36 2012] [error] Exception KeyError: KeyError(140249420548064,) in <module 'threading' from '/usr/lib64/python2.6/threading.pyc'> ignored 
[Wed Feb 29 01:45:36 2012] [error] Exception KeyError: KeyError(140249420548064,) in <module 'threading' from '/usr/lib64/python2.6/threading.pyc'> ignored 
[Wed Feb 29 01:45:36 2012] [error] Exception KeyError: KeyError(140249420548064,) in <module 'threading' from '/usr/lib64/python2.6/threading.pyc'> ignored 
[Wed Feb 29 01:45:36 2012] [error] Exception KeyError: KeyError(140249420548064,) in <module 'threading' from '/usr/lib64/python2.6/threading.pyc'> ignored 
[Wed Feb 29 01:45:36 2012] [notice] SIGHUP received. Attempting to restart 
[Wed Feb 29 00:45:36 2012] [error] Exception KeyError: KeyError(140249420548064,) in <module 'threading' from '/usr/lib64/python2.6/threading.pyc'> ignored 
[Wed Feb 29 01:45:36 2012] [notice] Digest: generating secret for digest authentication ... 
[Wed Feb 29 01:45:36 2012] [notice] Digest: done 
[Wed Feb 29 01:45:36 2012] [warn] mod_wsgi: Compiled for Python/2.6.2. 
[Wed Feb 29 01:45:36 2012] [warn] mod_wsgi: Runtime using Python/2.6.6. 
[Wed Feb 29 01:45:36 2012] [notice] Apache/2.2.15 (Unix) mod_auth_pgsql/2.0.3 PHP/5.3.3 mod_ssl/2.2.15 OpenSSL/1.0.0-fips mod_wsgi/3.2 Python/2.6.6 mod_perl/2.0.4 Perl/v5.10.1 configured -- resuming normal operations 

Aquí se /var/www/html/mysite/apache/apache_django_wsgi.conf que se carga en mi httpd.conf con la opción NameVirtualHost *:80

<VirtualHost *:80> 
    ServerName django.satoshi.example.com 
    ErrorLog "/var/log/httpd/django_error_log" 

    WSGIDaemonProcess django 
    WSGIProcessGroup django 

    Alias /media/ "/usr/lib/python2.6/site-packages/django/contrib/admin/media" 
    <Directory "/usr/lib/python2.6/site-packages/django/contrib/admin/media"> 
     Order allow,deny 
     Options Indexes 
     Allow from all 
     IndexOptions FancyIndexing 
    </Directory> 

    <Directory "/var/www/html/mysite"> 
     Order allow,deny 
     Options Indexes 
     Allow from all 
     IndexOptions FancyIndexing 
    </Directory> 

    WSGIScriptAlias/"/var/www/html/mysite/apache/django.wsgi" 

    <Directory "/var/www/html/mysite/apache"> 
     Order deny,allow 
     Allow from all 
    </Directory> 
</VirtualHost> 

Aquí es /var/www/html/mysite/apache/django.wsgi

import os 
import sys 

paths = [ 
    '/var/www/html/mysite', 
    '/var/www/html', 
    '/usr/lib/python2.6/site-packages/', 
] 

for path in paths: 
    if path not in sys.path: 
     sys.path.append(path) 

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings' 

import django.core.handlers.wsgi 
application = django.core.handlers.wsgi.WSGIHandler() 

Y finalmente aquí es parte de /var/www/html/mysite/settings.py

# Absolute filesystem path to the directory that will hold user-uploaded files. 
# Example: "/home/media/media.lawrence.com/media/" 
MEDIA_ROOT = '' 

# URL that handles the media served from MEDIA_ROOT. Make sure to use a 
# trailing slash. 
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/" 
MEDIA_URL = '' 

# Absolute path to the directory static files should be collected to. 
# Don't put anything in this directory yourself; store your static files 
# in apps' "static/" subdirectories and in STATICFILES_DIRS. 
# Example: "/home/media/media.lawrence.com/static/" 
PROJECT_ROOT = os.path.normpath(os.path.dirname(__file__)) 
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static') 

# URL prefix for static files. 
# Example: "http://media.lawrence.com/static/" 
STATIC_URL = '/static/' 

# URL prefix for admin static files -- CSS, JavaScript and images. 
# Make sure to use a trailing slash. 
# Examples: "http://foo.com/static/admin/", "/static/admin/". 
ADMIN_MEDIA_PREFIX = '/static/admin/' 

# Additional locations of static files 
STATICFILES_DIRS = ( 
    # Put strings here, like "/home/html/static" or "C:/www/django/static". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
) 

# List of finder classes that know how to find static files in 
# various locations. 
STATICFILES_FINDERS = ( 
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
# 'django.contrib.staticfiles.finders.DefaultStorageFinder', 
) 

Quiero saber si ustedes necesitan cualquier otro archivo. ¡Gracias por adelantado!

+5

Excelente pregunta. Hiciste tu tarea y proporcionaste mucha información para trabajar. Seguid así. –

+0

Una gran pregunta, también me perdí y agregué ADMIN_MEDIA_PREFIX a mi archivo de configuración. – edu222

Respuesta

28

creo que debe cambiar:

Alias /media/ "/usr/lib/python2.6/site-packages/django/contrib/admin/media" 

a:

Alias /static/admin/ "/usr/lib/python2.6/site-packages/django/contrib/admin/media" 

Debido a que tiene:

ADMIN_MEDIA_PREFIX = '/static/admin/' 
+1

Eso solo se aplica a Django 1.4, que aún no es un lanzamiento oficial (aunque está cayendo muy pronto). En Django 1.3, * necesitas * 'ADMIN_MEDIA_PREFIX'. No funcionará sin eso. –

+0

Gracias por el aviso, creo que solo necesita cambiar su Alias ​​para que coincida con ADMIN_MEDIA_PREFIX después de todo. – jpic

+0

¡Genial! Eso funcionó perfecto. Vaya, esa fue una solución fácil que pasé por alto ... Más tarde tendré que hacer lo estándar y tener algo así como lighthttpd manejar archivos estáticos. Pero esa será otra pregunta en otro día: P. Gracias @jpic. Me has ayudado antes también :-). – hobbes3

2

yo nos solución, miré a los archivos access_log dentro de/var/log/httpd/

127.0.0.1 - - [28/Dec/2013:14:49:20 -0500] "GET /static/admin/css/login.css HTTP/1.1" 200 836 "http://127.0.0.1/admin/" "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.24) Gecko/20111109 CentOS/3.6.24-3.el6.centos Firefox/3.6.24" 

por lo que añade las siguientes etiquetas en el archivo /etc/httpd/conf/httpd.conf,

Alias /static /usr/lib/python2.6/site-packages/django/contrib/admin/static 

dentro <VirtualHost 127.0.0.1:80> etiqueta

entonces me reinicia el servicio utilizando

service httpd restart 

y ¡Funciona!

14

Eso es porque no ha configurado previamente sus archivos estáticos ...

Añadir a la configuración:

STATIC_URL = '/static/' 
STATIC_ROOT = '/var/www/static/' 

A continuación, ejecute "python manage.py collectstatic"

Eso va a poner todo los archivos en STATIC_ROOT que STATIC_URL servirá ... ¡No debe apuntar a Apache en sus archivos lib de Python!

Si quiere también sus propios archivos estáticos específicos de la aplicación, configure "STATICFILES_DIRS".

+2

Esta debería ser la respuesta aceptada: collectstatic mueve los archivos necesarios a tu dir estático y los sirve desde allí. – bdf

Cuestiones relacionadas