Sé que esto se ha preguntado antes, pero estoy teniendo un tiempo difícil la configuración de JS en mi web Django app, aunque estoy leyendo la documentación.

Estoy corriendo con el Django dev server. Mi archivo de estructura se parece a esto:

mysite/
      __init__.py
      MySiteDB
      manage.py
      settings.py
      urls.py
      myapp/
           __init__.py
           admin.py
           models.py
           test.py
           views.py
           templates/
                index.html

Cuando quiero poner el Javascript y el CSS? Yo lo he probado en un montón de lugares, incluyendo myapp/, templates/ y mysite/, pero ninguno parece funcionar.

De index.html:

<head>
    <title>Degree Planner</title>
    <script type="text/javascript" src="/scripts/JQuery.js"></script>
    <script type="text/javascript" src="/media/scripts/sprintf.js"></script>
    <script type="text/javascript" src="/media/scripts/clientside.js"></script>
</head>

De urls.py:

(r'^admin/', include(admin.site.urls)),
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': 'media'})
(r'^.*', 'mysite.myapp.views.index'),

Sospecho que el serve() línea es la causa de los errores como:

TypeError at /admin/auth/
'tuple' object is not callable

Sólo para redondear el desenfrenado agitando, he cambiado la configuración en settings.py:

MEDIA_ROOT = '/media/'
MEDIA_URL = 'http://127.0.0.1:8000/media'

ACTUALIZACIÓN: he hecho algunos cambios, pero aún no funciona:

settings.py:

ROOT_PATH = os.path.normpath(os.path.dirname(__file__))

urls.py:

(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': os.path.join(settings.ROOT_PATH, 'site_media')}),

index.html:

<script type="text/javascript" src="/media/JQuery.js"></script>
<script type="text/javascript" src="/media/sprintf.js"></script>
<script type="text/javascript" src="/media/clientside.js"></script>

Sistema de ficheros:

mysite/
      site_media/
                JQuery.js
                sprintf.js
                clientside.js
      __init__.py
      settings.py
      manage.py
      -- etc
      myapp/
           -- app files, etc

Cuando voy a una url como http://127.0.0.1:8000/media/sprintf.js, me sale:

Page not found: /media/sprintf.js
  • Si activa la DEPURACIÓN, la página de error 404 debe tener algo como: «/home/……/site_media/sprintf.js» no existe, entonces usted puede ver si el sistema de ruta de acceso es correcta.
  • Tal vez esto podría ser de ayuda: stackoverflow.com/questions/14799835/…
InformationsquelleAutor Nick Heiner | 2010-05-01

8 Comentarios

  1. 4

    Pero eso no /media/ directorio global de existir? Y han colocado allí por un scripts subdirectorios con las secuencias de comandos que desea servir a partir de ahí? ¿Qué acerca de la /scripts/... url desde la que desea servir JQuery.js — que no parece ser servido en cualquier lugar desde tu urls.py. Si por cualquier motivo desea servir scripts (o de cualquier otra forma estática servido de archivo) de diferentes URL de caminos, todas las URL de las rutas deben coincidir en urls.py con la estática de la porción — o bien, hacer las cosas normales y servir a todos ellos de la /media/... URL de la raíz, y el mapa que los medios de comunicación de la raíz al directorio donde realmente mantener estos archivos (en sus respectivos subdirectorios, normalmente).

    Django es docs sobre la estática de servir (para el desarrollo sólo, ya que está documentado como

    El uso de este método es ineficiente y
    inseguro. No usar en una
    configuración de producción. Utilice esta opción únicamente para
    desarrollo.

    así que ten cuidado!-) parece bastante claro para mí.

    • Bien, entonces ¿de qué otra manera podría hacerlo? Hay un método para integrar cosas como javascript, css e imágenes (las cosas descritas aquí) aparte de un método que ha sido considerado ineficiente y insegura?
  2. 2

    Puede que desee utilizar la ruta absoluta ‘document_root’ en urls.py si desea utilizar el servidor de desarrollo para servir los archivos estáticos. MEDIA_ROOT y MEDIA_URL no juega ningún papel aquí.

    Aquí están mis ajustes para su referencia. Puse todos los archivos de medios en virtud de site_media/

    mysite/
        site_media/
            css/
            js/
            images/
        ...

    en settings.py:

    ROOT_PATH = os.path.normpath(os.path.dirname(__file__))

    en urls.py:

    url(r'^media/(?P<path>.*)$', "django.views.static.serve", {'document_root':
                                          os.path.join(settings.ROOT_PATH, 'site_media')})

    Puede mover los archivos estáticos en otro lugar, sólo necesita un punto ‘document_root’ a la ruta correcta. Asegúrese de que el comentario fuera de esta dirección de la línea de producción de implementación.

    • Esto no está funcionando para mí. Yo soy capaz de hacer os.path.join(ROOT_PATH, 'site_media') en el Django shell, y funciona bien, y señala a la ubicación quiero, pero aún nada está siendo servido.
    • Usted puede usar algo como firebug para ver cuál es el problema con la carga de su javascripts. Básicamente, usted necesita utilizar una ruta absoluta para ‘document_root’ como /home/rosarch/…./site_media. Sólo estoy usando la configuración.ROOT_PATH por conveniencia.
  3. 1

    De hecho, usted puede poner los archivos Javascript (y todo su contenido estático) en cualquier lugar que desee. Quiero decir, Django no imponer un estándar en dónde colocarlos, después de todo ellos no van a ser manejados por Django, que van a ser servidos por el servidor web.

    Dijo que, Es una buena idea para mantenerlos en algún lugar cercano a los archivos del proyecto. Yo recomiendo guardarlos en una carpeta relacionada con su código de Django. Mismo con MEDIA_ROOT.

    Es una buena idea para separar los archivos estáticos de los archivos de python, porque ahora se puede poner totalmente en carpetas separadas en un entorno de producción y fácilmente dar diferentes de acceso a los archivos estáticos y el código de python (decir el acceso FTP, o permisos).

    Algo a tener en cuenta es que la configuración de’ MEDIA_ROOT es el lugar donde el usuario de los archivos de medios (que es subido contenido) será colocado, estos no son la estática de los archivos de proyecto, estos son todos los archivos de su aplicación de Django cargas (avatares, accesorios, etc).

    Propuesta de estructura de carpetas:

    mysite.com/
      media/       - User media, this goes in settings.MEDIA_ROOT
      static/      - This is your static content folder
        css/
        js/
        images/
      templates/
      project/     - This is your Django project folder
        __init__.py
        manage.py
        settings.py
        myapp/
          __init__.py
          ...files..py

    Ver las otras respuestas recomendación sobre el uso de Django es serve() función para el desarrollo del medio ambiente. Sólo asegúrese de agregar que url() a su urlpatterns bajo un settings.DEBUG is True condicional.

    Como para sus plantillas, es una buena idea usar un contexto del procesador para enviar su archivo estático de la ruta de acceso a todas las plantillas.

    • Creo que Django ya incluye un contexto procesador para su MEDIA_URL configuración: django.núcleo.context_processors.los medios de comunicación
    • Sí, lo es. a pesar de que en la estructura de carpetas de uso I se diferencian de los MEDIOS de ESTÁTICA, como los MEDIOS de comunicación tiene los archivos del usuario y mantiene ESTÁTICA del sitio de contenido estático. a continuación, el MEDIA_URL contexto procesador es bueno para hacer referencia a los archivos del usuario, pero puedo crear un nuevo STATIC_URL de la web de contenido estático.
  4. 0

    Me sirven de javascript a través de la estática. Así que tengo algo en mi urls.py como

    (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': os.getenv('STATIC_DIR')})

    Así JS url aspecto /static/js/blah.js, CSS url aspecto /static/css/blah.css, etc. Tengo Apache manejar el directorio estático cuando se ejecuta en la producción, para evitar cualquier problema con Django estática de servir de mecanismo.

    • donde se 'STATIC_DIR' conjunto?
    • Donde quiera que sus datos estáticos vidas.
  5. 0

    Para mi trabajo de desarrollo, puedo usar Django incorporada en el servidor, pero he leído los archivos de medios desde el mismo directorio como lo harían en la producción (/srv/nginx/sitio/media/). Así que el clon exacto de la estructura de directorios de mi servidor de producción en mi computadora en casa, lo que me permite sin problemas de inserción de los cambios de la producción sin tener que cambiar nada.

    Puedo mantener dos diferentes settings.py archivos, a pesar de. Mi casa settings.py el archivo tiene mi local configuración de base de datos, diferentes MEDIA_URL configuración y DEPURACIÓN establece en True. Puedo usar esto en mi Url de archivo para habilitar la vista de servidor de medios de comunicación locales (ya que yo no ejecutar nginx en mi ordenador de casa).

    En urls.py:

    if settings.DEBUG:
        urlpatterns += patterns('',
            (r'^media/(?P<path>.*)$', 'django.views.static.serve',
                {'document_root': settings.MEDIA_ROOT}),
        )

    De settings.py (nota, MEDIA_ROOT debe ser una ruta absoluta):

    # Absolute path to the directory that holds media.
    # Example: "/home/media/media.lawrence.com/"
    MEDIA_ROOT = '/srv/nginx/<sitename>/media/'
    
    # URL that handles the media served from MEDIA_ROOT. Make sure to use a
    # trailing slash if there is a path component (optional in other cases).
    # Examples: "http://media.lawrence.com", "http://example.com/media/"
    MEDIA_URL = 'http://127.0.0.1:8000/media/'
    
    TEMPLATE_CONTEXT_PROCESSORS = (
        # I've taken out my other processors for this example
        "django.core.context_processors.media",
    )

    De una plantilla:

    <link rel="stylesheet" href="{{ MEDIA_URL }}css/form.css" />{% endblock %}

    Sistemas de archivos:

    /srv/nginx/<sitename>
        /media  <-- MEDIA_ROOT/MEDIA_URL points to here
            /css
                base.css
                form.css
            /img
            /js

    Oh, también: si es una copia directa de su urls.py archivo, se le olvidó una coma después de servir a su punto de vista, que es la causa de su TypeError 😉

    • De hecho, ese era el problema detrás de la TypeError. Esto todavía no está funcionando para mí. ¿Qué es el directorio de trabajo actual que document_root comienza a partir de?
    • No estoy seguro de si se inicia a partir de un directorio, pero me imagino que tu proyecto de la raíz si tuviera que adivinar. El único escenario en el que usted debe estar utilizando el servidor de desarrollo o de servir a la vista está trabajando a nivel local, y usted debería ser capaz de hacer una ruta absoluta en el cuadro local.
    • Sí, debería… pero de alguna manera no está funcionando. He actualizado el OP con mis intentos posteriores.
    • Pruebe a cambiar os.path.normpath a os.path.abspath. Me encontré con que la línea para ver lo que ROOT_PATH sería y me dieron un resultado de ‘.’
    • También, es una buena idea usar Django del MEDIA_URL y MEDIA_ROOT configuración para este tipo de cosas, agregar django.core.context_processors.media a su contexto procesadores y tendrás acceso a {{ MEDIA_URL }} en sus plantillas. Voy a actualizar mi respuesta con esta.
    • MEDIA_URL y MEDIA_ROOT se utilizan principalmente en la carga de archivos, creo. Yo normalmente no se mezclan con mis propios archivos estáticos.
    • Necesita especificar upload_to con los archivos subidos, lo que les separa de sus archivos. Me juego que a algo así como uploads/<field>. Muchos de Django que utilizan los sitios de sus MEDIA_URL para servir archivos estáticos, tales como… de Django.

  6. 0

    El error 404 se produce porque MEDIA_ROOT requiere ruta de acceso absoluta, no relativa. El servidor está intentando obtener acceso a /media en el sistema de ficheros, que obviamente no es lo que usted desea.

    Intente esto en su lugar:

    import os
    PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))
    MEDIA_ROOT = os.path.join(PROJECT_PATH, 'site_media')
    MEDIA_URL = '/media/'
    • Esta respuesta me ayudó. Thx.
  7. 0

    Esta es una estructura que voy a usar en un proyecto separado en varias aplicaciones. Es una buena práctica para adaptar la estructura a la derecha en el principio, usted no quiere global de reordenamiento cuando usted necesita para agregar otra aplicación a su proyecto.

    /media
      favicon.ico
      robots.txt
      /upload # user uploaded files
      /js  # global js files like jQuery
      /main_app
        /js
        /css
        /img
      /other_app
        /js
        /css
        /img

    Entonces yo uso excelente StaticMiddleware de django-molesto para servir los archivos. settings.py:

    import os
    import annoying
    
    MEDIA_ROOT = os.path.join(os.path.dirname(__file__), "media")
    MIDDLEWARE_CLASSES = (
        'annoying.middlewares.StaticServe',
        #...
    )
  8. 0

    Me acaba de quitar el ‘^’,
    «r’static/» en lugar de «r’^estática/».
    Lo que funciona para mí ,la buena suerte.

    url(r'static/(?P<path>.*)$', 'django.views.static.serve',
         { 'document_root': the_path }),

Dejar respuesta

Please enter your comment!
Please enter your name here