files debug django django-views django-staticfiles

debug - django static files



¿Por qué DEBUG=La configuración falsa hace que mi acceso a archivos estáticos django falle? (12)

Aunque no es lo más seguro, puedes cambiarlo en el código fuente. navegue hasta Python/2.7/site-packages/django/conf/urls/static.py

Luego edita como sigue:

if settings.DEBUG or (prefix and ''://'' in prefix):

Entonces, si settings.debug==False no afectará al código, también después de ejecutar intente python manage.py runserver --runserver para ejecutar archivos estáticos.

NOTA : La información solo debe usarse para pruebas

Estoy construyendo una aplicación usando Django como mi caballo de batalla. Hasta ahora todo ha estado bien: configuraciones de db especificadas, directorios estáticos configurados, urls, vistas, etc. Pero los problemas comenzaron a escabullirme en el momento en que quise renderizar mis propias páginas hermosas y personalizadas de 404.html y 500.html.

Leí los documentos sobre el manejo personalizado de errores y configuré las configuraciones necesarias en UrlsConf, creé las vistas correspondientes y añadí el 404.html y el 500.html al directorio de plantillas de mi aplicación (especificado en la configuración.py también).

Pero los documentos dicen you can actually view custom error views until Debug is Off , así que lo desactivé para probar mis cosas, ¡y ahí es cuando las cosas se vuelven locas!

No solo no puedo ver el 404.html personalizado (en realidad, se carga, sino porque cada una de mis páginas de error contiene un mensaje de error gráfico, como una buena imagen), ¡la fuente de la página de error se carga, pero nada más se carga! ¡Ni siquiera vinculados a CSS o Javascript!

En general, una vez que configuro DEBUG = False , se cargarán todas las vistas, pero no se cargará ningún contenido vinculado (CSS, Javascript, imágenes, etc.). ¿Qué esta pasando? ¿Hay algo que falte, relacionado con los archivos estáticos y la configuración DEBUG ?


Con la depuración desactivada, Django ya no manejará los archivos estáticos: el servidor web de producción (Apache o algo así) debería encargarse de eso.


El soporte para los argumentos de vista de cadena a url () está en desuso y se eliminará en Django 1.10

Mi solución es solo una pequeña corrección a la solución de Conrado arriba.

from django.conf import settings import os from django.views.static import serve as staticserve if settings.DEBUG404: urlpatterns += patterns('''', (r''^static/(?P<path>.*)$'', staticserve, {''document_root'': os.path.join(os.path.dirname(__file__), ''static'')} ), )


En realidad, puede servir archivos estáticos en una aplicación de Django de producción, de forma segura y sin DEBUG=True .

En lugar de usar Django, usa dj_static en tu archivo WSGI ( github ):

# requirements.txt: ... dj-static==0.0.6 # YOURAPP/settings.py: ... STATIC_ROOT = ''staticdir'' STATIC_URL = ''/staticpath/'' # YOURAPP/wsgi.py: ... from django.core.wsgi import get_wsgi_application from dj_static import Cling application = Cling(get_wsgi_application())


En urls.py he añadido esta línea:

from django.views.static import serve

agregar esas dos direcciones URL en los patrones de URL:

url(r''^media/(?P<path>.*)$'', serve,{''document_root'': settings.MEDIA_ROOT}), url(r''^static/(?P<path>.*)$'', serve,{''document_root'': settings.STATIC_ROOT}),

y tanto los archivos estáticos como los medios fueron accesibles cuando DEBUG = FALSE.
Espero eso ayude :)


La answer de Johnny es genial, pero aún así no me funcionó simplemente agregando las líneas que se describen allí. Basado en esa respuesta, los pasos que realmente me funcionaron fueron:

  1. Instale WhiteNoise como se describe:

    pip install WhiteNoise

  2. Cree la variable STATIC_ROOT y agregue WhiteNoise a su variable MIDDLEWARE en settings.py :

    #settings.py MIDDLEWARE = [ ''django.middleware.security.SecurityMiddleware'', ''whitenoise.middleware.WhiteNoiseMiddleware'', #add whitenoise ''django.contrib.sessions.middleware.SessionMiddleware'', ... ] #... STATIC_ROOT = os.path.join(BASE_DIR, ''staticfiles'') ##specify static root

  3. Luego, modifique su archivo wsgi.py como se explica en la respuesta de Johnny:

    #wsgi.py from django.core.wsgi import get_wsgi_application from whitenoise.django import DjangoWhiteNoise application = get_wsgi_application() application = DjangoWhiteNoise(application)

  4. Después de eso, implemente los cambios en su servidor (con git o lo que sea que use).

  5. Finalmente, ejecute la opción collectstatic desde su manage.py en su servidor. Esto copiará todos los archivos de sus carpetas estáticas en el directorio STATIC_ROOT que especificamos antes:

    $ python manage.py collectstatic

    Ahora verá una nueva carpeta llamada staticfiles que contiene dichos elementos.

Después de seguir estos pasos, ahora puede ejecutar su servidor y podrá ver sus archivos estáticos en el modo de producción.

Actualización: En caso de que tuviera la versión <4, el changelog indica que ya no es necesario declarar el WSGI_APPLICATION = ''projectName.wsgi.application'' en su archivo settings.py .


Puede usar WhiteNoise para servir archivos estáticos en producción.

Instalar:

pip install WhiteNoise

Y cambia tu archivo wsgi.py a esto:

from django.core.wsgi import get_wsgi_application from whitenoise.django import DjangoWhiteNoise application = get_wsgi_application() application = DjangoWhiteNoise(application)

Y eres bueno para ir!

Crédito al blog creativo del manillar .

PERO, realmente no se recomienda servir archivos estáticos de esta manera en producción. Tu servidor web de producción (como nginx) debería hacerse cargo de eso.


Puedes depurar esto de muchas maneras diferentes. Aquí está mi enfoque.

localsettings.py:

DEBUG = False DEBUG404 = True

urls.py:

from django.conf import settings import os if settings.DEBUG404: urlpatterns += patterns('''', (r''^static/(?P<path>.*)$'', ''django.views.static.serve'', {''document_root'': os.path.join(os.path.dirname(__file__), ''static'')} ), )

Asegúrese de leer los documentos;)

https://docs.djangoproject.com/en/2.0/howto/static-files/#limiting-use-to-debug-true


Seguí los pasos explicados en la respuesta de DarkCygnus, pero aparece el siguiente error cuando ejecuto el siguiente comando

Mando:

from django.conf import settings import os from django.views.static import serve as staticserve if settings.DEBUG404: urlpatterns += patterns('''', (r''^static/(?P<path>.*)$'', staticserve, {''document_root'': os.path.join(os.path.dirname(__file__), ''static'')} ), )

Error:

if settings.DEBUG or (prefix and ''://'' in prefix):

He intentado cambiar los permisos de carpeta, pero todavía no funciona.

No soy capaz de encontrar una solución para solucionarlo.


Si aún necesita un servidor estático localmente (por ejemplo, para realizar pruebas sin depurar) puede ejecutar devserver en modo inseguro:

manage.py runserver --insecure


Si está utilizando la vista de servicio estático en desarrollo, debe tener DEBUG = True:

Advertencia

Esto solo funcionará si DEBUG es Verdadero.

Esto se debe a que esta visión es sumamente ineficiente y probablemente insegura. Esto solo está destinado al desarrollo local, y nunca debe utilizarse en la producción.

Docs: sirviendo archivos estáticos en Developent

EDITAR: Puede agregar algunas URL para probar sus plantillas 404 y 500, simplemente use la vista genérica direct_to_template en sus URL.

from django.views.generic.simple import direct_to_template urlpatterns = patterns('''', (''^404testing/$'', direct_to_template, {''template'': ''404.html''}) )


Simplemente abre tu proyecto urls.py, luego encuentra esta declaración if.

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

Puedes cambiar settings.DEBUG en True y funcionará siempre. Pero si su proyecto es algo serio, debería pensar en otras soluciones mencionadas anteriormente.

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

En django 1.10 puedes escribir así:

urlpatterns += [ url(r''^media/(?P<path>.*)$'', serve, { ''document_root'': settings.MEDIA_ROOT, }), url(r''^static/(?P<path>.*)$'', serve, { ''document_root'': settings.STATIC_ROOT }), ]