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:
Instale WhiteNoise como se describe:
pip install WhiteNoise
Cree la variable
STATIC_ROOT
y agregue WhiteNoise a su variableMIDDLEWARE
ensettings.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
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)
Después de eso, implemente los cambios en su servidor (con git o lo que sea que use).
Finalmente, ejecute la opción
collectstatic
desde sumanage.py
en su servidor. Esto copiará todos los archivos de sus carpetas estáticas en el directorioSTATIC_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 }), ]