Los sitios web generalmente necesitan entregar archivos adicionales como imágenes, JavaScript o CSS. En Django, nos referimos a estos archivos como “static archivos ”. Django proporciona django.contrib.staticfiles para ayudarlo a administrarlos.

Esta página describe cómo puede servir estos static archivos.

Configurando static archivos

  1. Asegúrate de eso django.contrib.staticfiles está incluido en tu INSTALLED_APPS.
  2. En su archivo de configuración, defina STATIC_URL, por ejemplo:

    STATIC_URL = '/static/'
    
  3. En sus plantillas, use el static etiqueta de plantilla para construir la URL para la ruta relativa dada usando el configurado STATICFILES_STORAGE.

    % load static %
    Mi imagen
    
  4. Almacene su static archivos en una carpeta llamada static en tu aplicación. Por ejemplo my_app/static/my_app/example.jpg.

Sirviendo los archivos

Además de estos pasos de configuración, también necesitará entregar el static archivos.

Durante el desarrollo, si usa django.contrib.staticfiles, esto lo hará automáticamente runserver Cuándo DEBUG se establece en True (ver django.contrib.staticfiles.views.serve()).

Este método es extremadamente ineficiente y probablemente inseguro, así es inadecuado para la producción.

Ver Despliegue static archivos para estrategias adecuadas para servir static archivos en entornos de producción.

Tu proyecto probablemente también tendrá static activos que no están vinculados a una aplicación en particular. Además de utilizar un static/ directorio dentro de sus aplicaciones, puede definir una lista de directorios (STATICFILES_DIRS) en su archivo de configuración donde Django también buscará static archivos. Por ejemplo:

STATICFILES_DIRS = [
    BASE_DIR / "static",
    '/var/www/static/',
]

Consulte la documentación para STATICFILES_FINDERS configuración para obtener detalles sobre cómo staticfiles encuentra sus archivos.

Espacio de nombres de archivos estáticos

Ahora nosotros podría ser capaz de salirse con la suya poniendo nuestro static archivos directamente en my_app/static/ (en lugar de crear otro my_app subdirectorio), pero en realidad sería una mala idea. Django usará el primero static encuentra cuyo nombre coincide, y si tenía un static archivo con el mismo nombre en un diferente aplicación, Django no podría distinguir entre ellos. Necesitamos poder apuntar a Django en el correcto, y la mejor manera de asegurarnos de esto es mediante espacio de nombres ellos. Es decir, poniendo esos static archivos dentro otro directorio con el nombre de la propia aplicación.

Puedes espacio de nombres static activos en STATICFILES_DIRS especificando prefijos.

Servicio static archivos durante el desarrollo

Si utiliza django.contrib.staticfiles como se explicó anteriormente, runserver hará esto automáticamente cuando DEBUG se establece en True. Si no tienes django.contrib.staticfiles en INSTALLED_APPS, aún puede servir manualmente static archivos usando el django.views.static.serve() vista.

¡Esto no es adecuado para uso en producción! Para conocer algunas estrategias de implementación comunes, consulte Despliegue static archivos.

Por ejemplo, si tu STATIC_URL Se define como /static/, puede hacerlo agregando el siguiente fragmento a su urls.py:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Nota

Esta función auxiliar funciona solo en modo de depuración y solo si el prefix es local (p. ej. /static/) y no una URL (p. ej. http://static.example.com/).

Además, esta función auxiliar solo sirve para el STATIC_ROOT carpeta; no funciona static descubrimiento de archivos como django.contrib.staticfiles.

Entrega de archivos cargados por un usuario durante el desarrollo

Durante el desarrollo, puede servir archivos multimedia subidos por el usuario desde MEDIA_ROOT utilizando el django.views.static.serve() vista.

¡Esto no es adecuado para uso en producción! Para conocer algunas estrategias de implementación comunes, consulte Despliegue static archivos.

Por ejemplo, si tu MEDIA_URL Se define como /media/, puede hacerlo agregando el siguiente fragmento a su ROOT_URLCONF:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Nota

Esta función auxiliar funciona solo en modo de depuración y solo si el prefix es local (p. ej. /media/) y no una URL (p. ej. http://media.example.com/).

Pruebas

Al ejecutar pruebas que usan solicitudes HTTP reales en lugar del cliente de prueba integrado (es decir, cuando se usa el LiveServerTestCase) el static los activos deben servirse junto con el resto del contenido para que el entorno de prueba reproduzca el real con la mayor fidelidad posible, pero LiveServerTestCase tiene solo muy básico static funcionalidad de servicio de archivos: no conoce la función de búsqueda de la staticfiles aplicación y asume la static el contenido ya se ha recopilado en STATIC_ROOT.

Debido a esto, staticfiles envía su propio django.contrib.staticfiles.testing.StaticLiveServerTestCase, una subclase de la integrada que tiene la capacidad de servir de forma transparente todos los activos durante la ejecución de estas pruebas de una manera muy similar a lo que obtenemos en tiempo de desarrollo con DEBUG = True, es decir, sin tener que recopilarlos utilizando collectstatic primero.

Despliegue

django.contrib.staticfiles proporciona un comando de administración de conveniencia para reunir static archivos en un solo directorio para que pueda servirlos fácilmente.

  1. Selecciona el STATIC_ROOT en el directorio desde el que le gustaría servir estos archivos, por ejemplo:

    STATIC_ROOT = "/var/www/example.com/static/"
    
  2. Ejecutar el collectstatic comando de gestión:

    $ python manage.py collectstatic
    

    Esto copiará todos los archivos de su static carpetas en el STATIC_ROOT directorio.

  3. Utilice un servidor web de su elección para entregar los archivos. Despliegue static archivos cubre algunas estrategias de implementación comunes para static archivos.

Aprende más

Este documento cubre los conceptos básicos y algunos patrones de uso comunes. Para obtener detalles completos sobre todas las configuraciones, comandos, etiquetas de plantilla y otras piezas incluidas en django.contrib.staticfiles, ver la referencia de archivos estáticos.