2012-05-05 20 views
13

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

14

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", 
    ) 
} 
+2

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

4

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 ...

+0

¿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? –

+0

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/ –

+0

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. –

1

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