python - debug - django static files not found
Diferencias entre STATICFILES_DIR, STATIC_ROOT y MEDIA_ROOT (3)
Desarrollo
STATIC_ROOT
es inútil durante el desarrollo, solo es necesario para la implementación.
Mientras está en desarrollo, STATIC_ROOT
no hace nada. Incluso no es necesario configurarlo. Django busca archivos estáticos dentro del directorio de cada aplicación ( myProject/appName/static
) y los sirve automáticamente.
Esta es la magia hecha por manage.py runserver
cuando DEBUG=True
.
Despliegue
Cuando su proyecto se activa, las cosas difieren. Lo más probable es que sirvas contenido dinámico usando Django y Nginx servirá los archivos estáticos. ¿Por qué? Porque Nginx es increíblemente eficiente y reducirá la carga de trabajo de Django.
Aquí es donde STATIC_ROOT
vuelve práctico, ya que Nginx no sabe nada sobre su proyecto django y no sabe dónde encontrar los archivos estáticos.
Así que establece STATIC_ROOT = ''/some/folder/''
y le dice a Nginx que busque archivos estáticos en /some/folder/
. Luego ejecuta manage.py collectstatic
y Django copiará los archivos estáticos de todas las aplicaciones que tenga en /some/folder/
.
Directorios adicionales para archivos estáticos
STATICFILES_DIRS
se usa para incluir directorios adicionales para collectstatic
a buscar. Por ejemplo, de forma predeterminada, Django no reconoce /myProject/static/
. Entonces puede incluirlo usted mismo.
Ejemplo
STATIC_URL = ''/static/''
if not DEBUG:
STATIC_ROOT = ''/home/django/www-data/site.com/static/''
STATICFILES_DIRS = [
os.path.join(BASE_DIR, ''static/''),
]
¿Cuáles son las diferencias de estas tres URL estáticas?
No estoy seguro si estoy en lo correcto, estoy usando MEDIA_ROOT
para almacenar mis fotos cargadas (a través de models.ImageField()
)
Sin embargo, creé un script JS para mi administrador y en admin.py
. Definí los medios de la siguiente manera:
....
class Media:
js = (''/admin/custom.js'', )
y mi settings.py
:
....
STATIC_ROOT = "/home/user/project/django1/top/listing/static"
y agregué el custom.js
a STATIC_ROOT/admin/custom.js
, pero no está funcionando. Lanzando el error 404 no encontrado.
Y luego cambio el STATIC_ROOT
a STATICFILES_DIRS
, ¡y funciona!
....
STATICFILES_DIRS = "/home/user/project/django1/top/listing/static"
Entonces, no entiendo lo que está pasando aquí. De hecho, simplemente no entiendo cuál es la diferencia entre STATIC_ROOT
y STATICFILES_DIRS
.
Actualmente estoy probando Django en mi máquina a través de virtualenv, aún no implementado, ¿es la razón por la cual STATIC_ROOT
no funciona?
Diferencia entre STATICFILES_DIRS
y STATIC_ROOT
STATICFILES_DIRS
puede contener otros directorios (no necesariamente directorios de aplicaciones) con archivos estáticos y estos archivos estáticos se recopilarán en su STATIC_ROOT cuando ejecute collectstatic
. Estos archivos estáticos serán servidos por su servidor web y serán servidos desde su STATIC_ROOT.
Si tiene archivos actualmente en su STATIC_ROOT que desea atender, debe moverlos a un directorio diferente y colocar ese otro directorio en STATICFILES_DIRS
. Su directorio STATIC_ROOT
debe estar vacío y todos los archivos estáticos deben ser recopilados en ese directorio.
MEDIA_ROOT
donde MEDIA_ROOT
los archivos multimedia, todos los archivos cargados. Ejemplo: imágenes, archivos
Puede encontrar estas configuraciones en la documentación de Django . Aquí están mis propias definiciones y citas de la documentación:
MEDIA_ROOT
es la carpeta dondeMEDIA_ROOT
los archivos cargados conFileField
.Ruta absoluta del sistema de archivos al directorio que contendrá los archivos cargados por el usuario .
STATIC_ROOT
es la carpeta donde se almacenarán los archivos estáticos después de usarmanage.py collectstatic
La ruta absoluta al directorio donde
collectstatic
recopilará los archivos estáticos para su implementación.Si la aplicación contrib de
staticfiles
está habilitada (por defecto), el comando de gestióncollectstatic
recopilará archivos estáticos en este directorio. Consulte la guía sobre la administración de archivos estáticos para obtener más detalles sobre el uso.STATICFILES_DIRS
es la lista de carpetas donde Django buscará archivos estáticos adicionales aparte de la carpetastatic
de cada aplicación instalada.Esta configuración define las ubicaciones adicionales que atravesará la aplicación staticfiles si el buscador
FileSystemFinder
está habilitado, por ejemplo, si usa el comando de administracióncollectstatic
ofindstatic
o utiliza la vista de servicio de archivos estáticos.
En su configuración, debe tener:
MEDIA_ROOT = os.path.join(BASE_DIR, "media/")
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
# Make a tuple of strings instead of a string
STATICFILES_DIRS = ("/home/user/project/django1/top/listing/static", )
...dónde:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
como se define en la configuración de Django settings.py
ahora.