2012-06-10 11 views
5

Estoy probando mi primer proyecto webdev y estoy aprendiendo el framework django.Archivos estáticos de Django y filepaths en settings.py

Vine aquí para preguntar sobre la forma más limpia de usar "archivos estáticos", como el CSS externo al que me refiero en una de mis plantillas html. Intenté leer a través del official documentation on the subject, pero me pareció un poco confuso como principiante, luego traté de buscar en Google pero noté que la mayoría de las guías o las respuestas del stackoverflow diferían ligeramente y me di cuenta de que necesitaba una mejor comprensión. Un poco descarado de preguntar pero, ¿podría alguien explicarme y resumir el proceso?

Como referencia, aquí está la jerarquía de mi carpeta de proyectos. En el momento que estoy tratando de hacer que la plantilla base.html utilizar el sylesheet en CSS/base.css: enter image description here

También una de las cosas que me sigue echando fuera es el uso de rutas de los archivos absolutos. Hasta ahora he logrado escapar usando solo archivos de ruta relativos, lo cual tiene más sentido para mí, ya que el objetivo es desarrollarlo en el servidor de prueba django y luego transferirlo a mi propio servidor cuando lo tenga. (Nota: tal vez sea porque no tengo idea de lo complicado que es el proceso de transferencia que no entiendo por qué son preferibles los pathspaths absolutos). ¿Cuál es el problema con el uso de rutas de archivo relativas?

Me doy cuenta de que esto se ha convertido en dos preguntas, lo que va en contra de las reglas, pero realmente creo que ambas podrían responderse juntas y si entendía una, probablemente ayudaría a comprender la otra. Cualquier ayuda sería muy apreciada.

Respuesta

2

Supongo que está utilizando Django 1.3 o superior, ya que le permite usar staticfiles (docs) para archivos estáticos. Aquí está la idea básica: cada sitio web de Django consiste en múltiples aplicaciones (directorios) que contienen todos los archivos necesarios para una parte particular del sitio web (es decir, un models.py, views.py, un directorio templates y también un directorio static). Este directorio static contiene los archivos JavaScript y CSS (así como otros archivos estáticos para esa aplicación.

Al implementar el sitio web, ejecuta el comando collectstatic para reunir todos los archivos estáticos en un solo directorio. . los archivos estáticos a los visitantes de su sitio (es decir, Apache o el servidor web diferente puede hacer eso por usted)

Así que la estructura general de su proyecto web pueden ser:

  • manage.py
  • sitio web/models.py
  • sitio web/views.py
  • sitio web/estática/web/css/base.css
  • sitio web/estática/sitio web/js/base.js
  • sitio web/templates/web/base.html
  • estática
  • settings.py
  • urls.py

se dará cuenta de que el nombre de la aplicación de Django se repite en los subdirectorios del static y templates directorios. Esto es necesario porque mantiene los archivos separados cuando se mueven a un directorio general static.En el ejemplo anterior, el STATIC_ROOT es el directorio de nivel superior static y en este directorio se copiarán todos sus archivos estáticos.

Definitivamente vale la pena leer la documentación de staticfiles ya que este diseño de proyecto le permite reutilizar las aplicaciones de Django en otros proyectos con facilidad. Por ejemplo, se puede imaginar un sitio web que tiene este aspecto:

  • blog/models.py
  • blog/templates/blog/overview.html
  • blog/templates/blog/post.html
  • blog/urls.py
  • blog/views.py
  • fotos/models.py
  • fotos/plantillas/fotos/overview.html
  • pho TOS/templates/fotos/photo.html
  • fotos/urls.py
  • fotos/views.py
  • manage.py
  • estática
  • settings.py
  • urls.py

Las aplicaciones blog y photos ahora se pueden reutilizar fácilmente en otros sitios web si así lo desea.

+0

Muchas gracias Demasiado para toda la información, estoy marcando esto como correcto, ya que hace algunos puntos muy buenos acerca de mantener el código modular y explicar el proceso de implementación un poco más. Desafortunadamente soy un tonto y todavía no he podido encontrar la forma de configurar mi propio proyecto de práctica correctamente, pero decidí abrir una nueva pregunta más específica aquí: http://stackoverflow.com/questions/ 11033571/using-static-files-with-the-django-virtual-server – Holly

+0

¿Cómo funciona esto con el comando foreman? Logré que todo funcionara bien hasta que comencé a tratar de usar capataz, y no cargaría ningún activo estático a nivel local ... pero funciona bien cuando se implementa ... esta respuesta de Simeon es la explicación más clara que he visto hasta el momento el proceso de lidiar con archivos estáticos, pero esperaba algo más de claridad al usar Foreman frente a instancias en vivo ... en este momento mi administrador no tiene css al ver al capataz ... ¿alguna idea? – tbarbe

1

Realmente aprecio el tiempo puesto en la respuesta de @Simeon Visser, y había información muy útil allí, pero no era exactamente lo que estaba buscando. Así que le pedí alrededor y he sinister_user_name de Reddit que agradecer por esto, por lo que pensé que podría ayudar a alguien más:


archivos estáticos han cambiado un poco justo en versiones recientes de modo viejas blogs podrían ser un poco de un desastre.

Voy a darle un tiro:

En sus plantillas que puede utilizar la etiqueta static_url y Django rellenar el camino para ti.

<link rel="stylesheet" href="{{ STATIC_URL }}css/bootstrap.min.css"> 

Rellena la url estática mirando el archivo de configuración. STATIC_URL por defecto a /static/ Creo que en la configuración? Si los archivos estáticos terminan en una URL extraña en su servidor web corporativo, puede cambiarlos en la configuración de todos modos y se reflejará en todas las plantillas. Entonces no importa si son absolutos.

Cuando va a implementar rellene STATIC_ROOT en su configuración, esta es solo la ruta que ha configurado su servidor web para encontrar los archivos estáticos. Luego, si ejecuta manage.py collectstatic, los copiará en ese directorio. Esa es la única función de STATIC_ROOT, creo.

Guardo el directorio de plantillas separado de mi directorio estático, principalmente porque desea que su servidor web solo sirva archivos estáticos, mientras que las plantillas son procesadas por python. Por lo tanto, los archivos estáticos casi no forman parte de su aplicación en la medida en que el servidor web los vea. Guardo mis plantillas y archivos estáticos en rutas separadas solo en el directorio base, principalmente porque ambos no son archivos fuente de Python.

Así que mi estructura del proyecto sería como:

manage.py 
website/settings.py 
app/models.py 
app/views.py 
templates/base.html 
static/js/jquery.js 
static/css/bootstrap.css 

El problema con las rutas relativas es que tendrán que cambiar si cambia su esquema de URL.

Opcional: Encontré en este blog que ayuda a no colocar rutas absolutas del sistema de archivos en la configuración.py que es bueno si trabaja desde varias máquinas, por ejemplo, trabajo y casa :( Con el diseño ligeramente diferente para 1.4 que uso esta en la parte superior de mi configuración:

import os 
import django 
import manage 

DJANGO_ROOT = os.path.dirname(os.path.realpath(django.__file__)) 
SITE_ROOT = os.path.dirname(os.path.realpath(manage.__file__)) 

en lugar de lo que sugieren (la ubicación de la configuración se ha movido en 1.4 o 1.3) por lo SITE_ROOT está en mal estado Creo que podría funcionar más adelante en el.. configuración que uso esto:

# Additional locations of static files 
STATICFILES_DIRS = (
    os.path.join(SITE_ROOT, 'static'), 
) 

Esto le indicará al servidor de desarrollo dónde encontrar los archivos estáticos. Puede hacer lo mismo con las plantillas o simplemente usar la ruta completa del archivo.

+1

Su información es correcta también, aunque su configuración es menos modular. Idealmente, todos los archivos estáticos y los archivos de plantillas deberían estar en un directorio dentro de una aplicación (con solo algunas excepciones, como 404.html y 500.html, que deben ubicarse en un directorio de plantillas raíz).Al desarrollar localmente, el directorio 'STATIC_ROOT' debe estar vacío y solo debe tener archivos en el servidor de producción. –

4

Aquí es un conjunto de fragmentos de código de settings.py he cambiado para incluir archivos estáticos configuración de Django para drchrono proyecto.

import os 
import django 
DJANGO_ROOT = os.path.dirname(os.path.realpath(django.__file__)) 
SITE_ROOT = os.path.dirname(os.path.realpath(__file__)) 

configurar dinámicamente variables de directorio SITE_ROOT

DATABASES = { 
     'default': { 
      'ENGINE': 'django.db.backends.sqlite3', 
      'NAME': os.path.join(SITE_ROOT,'data.db'),      

donde se almacena la base de datos sqlite3 que necesita dirección absoluta

  'USER': '', 
      'PASSWORD': '', 
      'HOST': '',      
      'PORT': '',      
     } 
    } 


STATIC_ROOT = SITE_ROOT 
STATIC_URL = '/static/' 

archivos estáticos tienda aquí

STATICFILES_DIRS = (
    os.path.join(SITE_ROOT,'static'), 
     ) 

donde XX Plantillas de correo se almacenan

TEMPLATE_DIRS = (
    os.path.join(SITE_ROOT,'templates'), 

) 

Ahora en las plantillas utilizan

{% load static %} --at beginning 
<link href="{% static "css/bootstrap.min.css"%}" rel="stylesheet" media="screen"> 

esto es un ejemplo que muestra cómo acceder a "css/bootstrap.min.css" en el directorio estática

Cuestiones relacionadas