Apache 403 mientras sirve archivos estáticos de Django

He revisado muchas de las publicaciones relacionadas, pero nada parece estar ayudando.
Información relevante:

Django versión - 1.4

Versión Apache - 2.2

Versión de Python - 2.7

Sistema operativo - Xubuntu 12.04

DB-Mysql

Estoy tratando de hacer que Apache sirva tanto la aplicación django como los archivos estáticos. El problema se hace evidente en el sitio de administración que no muestra ninguno de los estilos o imágenes CSS. Mi sitio de administración actualmente se ve así:

(bueno, habría incluido una imagen, pero el desbordamiento de la pila no me lo permitió. Basta con decir que se parece a la página de administración de todos los demás que han publicado sobre este tema, vea Apache no sirve archivos estáticos de administración de django )

Las piezas de la aplicación, como mi página de inicio de sesión y algunos contenidos dinámicos, funcionan bien, pero cuando trato de ofrecer contenido estático, aparece un error 403. Además, cuando trato de navegar a la hoja de estilo manualmente mirando el html renderizado de la página de administración y haciendo clic en el enlace a la hoja de estilo en

http://localhost/static/admin/css/base.css 

Me sale un error 403. Puedo navegar allí en una terminal y cambié los permisos de la carpeta para que el usuario www-data de Apache tenga acceso explícito a todos los archivos.

Aquí están las piezas relevantes de mi httpd.conf:

#AliasMatch ^/([^/]*\.css) /usr/local/wsgi/static/styles/$1

Alias /media/ "/usr/local/wsgi/media/"
Alias /static/ "/usr/local/wsgi/static/"

<Directory "/usr/local/wsgi/static">
Order deny,allow
Allow from all
</Directory>

<Directory "/usr/local/wsgi/media">
Order deny,allow
Allow from all
</Directory>
WSGIScriptAlias / "/home/noah/Documents/Web/Basic/apache/django.wsgi"

<Directory "/usr/local/wsgi/scripts">
Order allow,deny
Allow from all
</Directory>

Siguiendo el consejo de un amigo, también copié lo anterior en el valor predeterminado disponible de mis sitios:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www
    TypesConfig /etc/mime.types
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /home/noah/Documents/Web/Basic/apache/ >
        Options -Indexes FollowSymLinks
            AllowOverride AuthConfig FileInfo
            Order allow,deny
            Allow from all
        </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
    SetEnv DJANGO_SETTINGS_MODULE Basic.settings
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

#AliasMatch ^/([^/]*\.css) /usr/local/wsgi/static/styles/$1

Alias /media "/usr/local/wsgi/media/"
Alias /static "/usr/local/wsgi/static/"

<Directory "/usr/local/wsgi/static">
Order deny,allow
Allow from all
</Directory>

<Directory "/usr/local/wsgi/media">
Order deny,allow
Allow from all
</Directory>
WSGIScriptAlias / "/home/noah/Documents/Web/Basic/apache/django.wsgi"

<Directory "/usr/local/wsgi/scripts">
Order allow,deny
Allow from all
</Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>

Aquí está mi django.wsgi

import os
import sys

path = '/home/noah/Documents/Web/Basic'
if path not in sys.path:
    sys.path.append(path)

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

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

Y finalmente, aquí está mi configuración.py:

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

# 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 = 'http://localhost/media/'

# 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/"
STATIC_ROOT = '/usr/local/wsgi/static/'

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

# 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',
)

# Make this unique, and don't share it with anybody.
SECRET_KEY = 'bmc&amp;epl=#u)r3elkvj#@90*cji*z^cg8dnh$7j9kh@g9wzw(ih'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

ROOT_URLCONF = 'Basic.urls'

# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = 'Basic.wsgi.application'

Mi proyecto Django 'Básico' vive en ~/Documentos/Web/ que está vinculado a /var/www/

Cualquier ayuda es muy apreciada, y avíseme si necesita más archivos/información.

preguntado el 11 de junio de 12 a las 19:06

La diferencia radica en que la versión de django tiene características diferentes, y la solución allí simplemente no funciona para mí. -

3 Respuestas

También me enfrenté a este problema.

no puedo colocar los archivos estáticos en /var/www as Noé sugerido.

Resuelto agregando a apache2.conf:

<Directory /usr/local/django_apps/myapp/static>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

Respondido el 05 de junio de 14 a las 14:06

Pasaré el cheque a tu solución, porque la democracia... noah

Me pregunto por qué esto debe establecerse en apache.conf y no es adecuado dentro de los archivos vhosts... - dcolumbus

Acepto, la mejor práctica es configurarlo en un archivo conf personalizado de "sitios disponibles": Jossef Harush Kadouri

Configuré el archivo conf disponible en los sitios, resolví mi problema: Walucas

Otra posibilidad sería que falte una barra diagonal en el directorio raíz estático. La siguiente configuración estaba dando como resultado errores 403:

WSGIPythonPath /home/foo/app/
WSGIPythonHome /home/foo/.envs/foo

<VirtualHost *:80>
    Alias /static/ /home/foo/assets
    ServerAdmin foo@bar.com
    WSGIScriptAlias / /home/foo/app/wsgi.py
    ErrorLog ${APACHE_LOG_DIR}/app_wsgi_error.log
    CustomLog ${APACHE_LOG_DIR}/app_wsgi_access.log combined
    <Directory /home/foo/app/>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
    <Directory /home/foo/assets>
        Require all granted
    </Directory>
</VirtualHost>

Después de agregar una barra inclinada final a /home/foo/assets, todo funciono perfectamente. Espero que eso ayude a los futuros Googlers.

Respondido el 23 de diciembre de 15 a las 02:12

Me lo imaginé. Moví todos los archivos, los archivos estáticos y multimedia a /var/www y apache parece mucho más feliz

Respondido el 12 de junio de 12 a las 17:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.