Soy relativamente nuevo en Django (1.4) y me cuesta entender la filosofía detrás de los archivos estáticos, multimedia y de administración. La estructura del proyecto es diferente de un tutorial a otro, y lo mismo para Webfaction (donde alojaré mi aplicación). Me gustaría saber cuál es la mejor manera de organizarlo y con el menor dolor y edición posible mientras lo despliego en Webfaction, ¿qué sentido tienen los medios estáticos y los archivos admin? Gracias de antemanoConfusión en Django admin, archivos estáticos y multimedia
Respuesta
En esencia, usted quiere servir archivos estáticos por django en desarrollo. Una vez que esté listo para entrar en producción, quiere que el servidor haga esto por usted (están construidos para hacerlo rápido :-))
Aquí hay una configuración básica, una vez que inicia sesión en el servidor, ejecuta el comando collectstatic para obtener todos los staticfiles en la carpeta raíz estática, que sus puntos de servidores a (ver las reglas de reescritura)
./manage.py collectstatic
settings.py
from os import path
import socket
PROJECT_ROOT = path.dirname(path.abspath(__file__)) #gets directory settings is in
# Dynamic content is saved to here
MEDIA_ROOT = path.join(PROJECT_ROOT,'media')
# if ".webfaction.com" in socket.gethostname():
# MEDIA_URL = 'http://(dev.)yourdomain.com/media/'
# else:
MEDIA_URL = '/media/'
# Static content is saved to here --
STATIC_ROOT = path.join(PROJECT_ROOT,'static-root') # this folder is used to collect static files in production. not used in development
STATIC_URL = "/static/"
STATICFILES_DIRS = (
('', path.join(PROJECT_ROOT,'static')), #store site-specific media here.
)
# 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',
)
settings_deployment.py
from settings import *
DEBUG = False
TEMPLATE_DEBUG = DEBUG
MEDIA_URL = "http://yourdomain.com/media/"
urls.py
...other url patterns...
if settings.DEBUG:
urlpatterns += staticfiles_urlpatterns() #this serves static files and media files.
#in case media is not served correctly
urlpatterns += patterns('',
url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
'document_root': settings.MEDIA_ROOT,
}),
)
django.conf (lighttpd, esto podría ser Apache o Nginx) pero creo que webfaction tiene un servicio de aplicación para configurarlo fácilmente
$HTTP["host"] =~ "(^|\.)yourdomain\.com$" {
fastcgi.server = (
"/django.fcgi" => (
"main" => (
"socket" => env.HOME + "/project/project.sock",
"check-local" => "disable",
)
),
)
alias.url = (
"/media" => env.HOME + "/project/media",
"/static" => env.HOME + "/project/static-root",
)
url.rewrite-once = (
"^(/media.*)$" => "$1",
"^(/static.*)$" => "$1",
"^/favicon\.ico$" => "/static/img/favicon.png",
"^(/.*)$" => "/django.fcgi$1",
)
}
archivos estáticos son archivos necesarios para sus aplicaciones que el servidor puede servir sin modificaciones, como scripts personalizados JS, iconos, applets, etc. La mejor manera de usarlos es colocar los archivos estáticos en una carpeta "estática" en cada carpeta de su aplicación. Así, el servidor de prueba los encontrará allí, y si implementa en un servidor de producción, simplemente tendrá que ejecutar python manage.py collectstatic
para copiarlos todos en la carpeta estática de raíz definida en usted settings.py
Los archivos de medios son los cargados por los usuarios de sus aplicaciones, como las fotos de avatar, etc.
Los archivos de administración son archivos estáticos utilizados por Django admin, el servidor de prueba django los encontrará, pero en la producción, tendrá que copiarlos o vincularlos a esta carpeta para que el administrador realmente funcione.
espero que le ayuda a ver mejor las cosas ...
¿No puedo simplemente crear una única carpeta donde coloque todos los códigos css y javascript para mis páginas web en lugar de separarlos en carpetas?Quiero decir, tengo listo el diseño del sitio, pero solo necesito que funcione con Django. ¿Debo separar los archivos? –
Debe colocar los archivos estáticos en un directorio aparte del código python o las plantillas, ya que no desea exponer su código, pero aparte de eso puede diseñarlos de la manera que desee. Debe leer que: https://docs.djangoproject.com/en/1.4/howto/static-files/ –
lea cómo funcionan los archivadores de archivos en los documentos de django, todo está bien explicado allí, con el ejemplo que publiqué debajo debería tener sentido, django seguirá la jerarquía que use en la tupla del buscador de archivos y recolectará TODOS estos archivos en la carpeta de raíz estática, pero en un proyecto de desarrollo tiene mucho sentido mantenerlos separados de donde pertenecen. –
Mi configuración es:
1.settings.py
# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/var/www/example.com/media/"
MEDIA_ROOT='/media/'
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://example.com/media/", "http://media.example.com/"
MEDIA_URL = '/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: "/var/www/example.com/static/"
STATIC_ROOT = '/static/'
# URL prefix for static files.
# Example: "http://example.com/static/", "http://static.example.com/"
STATIC_URL = '/static/'
# Additional locations of static files
STATICFILES_DIRS = (
'/'.join(__file__.split(os.sep)[0:-2]+['static']),
# 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',
)
2.urls.py
from django.conf import settings
if settings.DEBUG:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
Y mi directorio de sitio es así:
root
│ manage.py
│
├─media
├─my_django_py3
│ settings.py
│ urls.py
│ views.py
│ wsgi.py
│ __init__.py
│
├─static
│ 9gq05.jpg
│ ajax.js
│ favicon.gif
│
├─templates
└─utils
- 1. Django: sirviendo archivos multimedia ADMIN
- 2. ¿Cuál es la diferencia entre los archivos estáticos y los archivos multimedia en Django?
- 3. Sirviendo archivos estáticos con mod_wsgi y Django
- 4. Django: probando archivos estáticos
- 5. ¿Cómo sirve Django los archivos multimedia?
- 6. django archivos estáticos de versiones
- 7. Django: css haciendo referencia a medios en archivos estáticos (django dev/1.3/archivos estáticos)
- 8. Archivos estáticos de Django y filepaths en settings.py
- 9. WMD en Django Admin?
- 10. Django 1.4 y NoReverseMatch en/admin/error
- 11. Cómo usar archivos estáticos con django nonrel
- 12. Django: Recolecte solamente los archivos estáticos cambiados
- 13. Django admin (y filter_vertical) no funciona
- 14. Django - Archivos estáticos de directorios de aplicaciones
- 15. Heroku - Manejo de archivos estáticos en la aplicación Django
- 16. Cómo subir archivos múltiples en los modelos django admin
- 17. Autor automático en Django admin
- 18. Formularios dinámicos en django-admin
- 19. django: using admin datepicker
- 20. ¿Subir imágenes usando Django Admin?
- 21. Funcionalidad emergente Django Admin
- 22. Django admin inline
- 23. Django fix Admin plural
- 24. Django Admin CSS falta
- 25. Django Admin Fieldsets
- 26. Django Admin + ¿Filtro horizontal?
- 27. personalizar seleccionar en django admin
- 28. Acciones personalizadas en Django Admin
- 29. Django admin paginación pregunta
- 30. Sirviendo archivos estáticos de raíz en Heroku con Django?
Algo que vale la pena mencionar es que si accidentalmente olvida la coma final en el elemento STATICFILES_DIRS, collectstatic comenzará a copiar todo en lugar de solo lo que está en las carpetas estáticas. Me tomó un tiempo darme cuenta, así que pensé en mencionarlo. – Soviut