Estou construindo um aplicativo usando o Django como meu cavalo de batalha. Tudo está bem até agora - configurações de banco de dados especificadas, diretórios estáticos, URLs, visualizações etc. Mas os problemas começaram a surgir no momento em que eu queria renderizar minhas próprias páginas 404.html e 500.html bonitas e personalizadas.
Li os documentos sobre tratamento de erros personalizados e defino as configurações necessárias no UrlsConf, criei as visualizações correspondentes e adicionei o 404.html e o 500.html ao diretório de modelos do meu aplicativo (especificado também em settings.py).
Mas os médicos dizem you can actually view custom error views until Debug is Off
, então eu desliguei para testar minhas coisas, e é aí que as coisas ficam loucas!
Não só não consigo visualizar o 404.html personalizado (na verdade, ele carrega, mas porque minhas páginas de erro contêm uma mensagem de erro gráfica - como uma imagem legal), a fonte da página de erro carrega, mas nada mais carrega! Nem mesmo CSS ou Javascript vinculado!
Geralmente, assim que eu definir DEBUG = False
, todas as visualizações serão carregadas, mas qualquer conteúdo vinculado (CSS, Javascript, Imagens, etc.) não será carregado! O que está acontecendo? Falta alguma coisa, relacionada aos arquivos estáticos e à DEBUG
configuração?
fonte
Respostas:
Com a depuração desativada, o Django não manipulará mais os arquivos estáticos - seu servidor Web de produção (Apache ou algo assim) deve cuidar disso.
fonte
Se você ainda precisa servidor estático localmente (por exemplo, para testar sem depuração), você pode executar o devserver no modo inseguro:
fonte
Você pode usar o WhiteNoise para servir arquivos estáticos na produção.
Instalar:
E mude seu arquivo wsgi.py para este:
E você está pronto para ir!
Crédito para o Guiador Creative Blog .
MAS, não é realmente recomendável exibir arquivos estáticos dessa maneira na produção. Seu servidor web de produção (como o nginx) deve cuidar disso.
fonte
wgsi.py
arquivo. A documentação que você vinculou parece fornecer outras instruções para o uso do WhiteNoise. Tentará outras formas e atualizará você aqui.manage.py runserver --insecure
não funcionou para mim. Este faz, no entanto.'whitenoise.middleware.WhiteNoiseMiddleware'
ao middleware. Veja as notas de versão do changelogEm urls.py, adicionei esta linha:
adicione esses dois URLs nos padrões de URL:
e os arquivos estáticos e de mídia eram acessíveis quando DEBUG = FALSE.
Espero que ajude :)
fonte
url(
comre_path(
Se você estiver usando a exibição estática de veiculação em desenvolvimento, precisará DEBUG = True:
Documentos: servindo arquivos estáticos em desenvolvedores
EDIT: você pode adicionar alguns URLs apenas para testar seus modelos 404 e 500, basta usar a visualização genérica direct_to_template em seus URLs.
fonte
A resposta de Johnny é ótima, mas ainda não funcionou para mim apenas adicionando as linhas descritas lá. Com base nessa resposta, as etapas que realmente funcionaram para mim onde:
Instale o WhiteNoise conforme descrito:
Crie a
STATIC_ROOT
variável e adicione WhiteNoise à suaMIDDLEWARE
variável emsettings.py
:Em seguida, modifique seu
wsgi.py
arquivo conforme explicado na resposta de Johnny:Depois disso, implante suas alterações no servidor (com git ou o que você usar).
Por fim, execute a
collectstatic
opçãomanage.py
no seu servidor. Isso copiará todos os arquivos de suas pastas estáticas noSTATIC_ROOT
diretório especificado anteriormente:Você verá uma nova pasta chamada
staticfiles
que contém esses elementos.Depois de seguir estas etapas, você poderá executar o servidor e poderá ver seus arquivos estáticos no modo de produção.
Update: No caso de você tinha a versão <4 o changelog indica que ele não é mais necessário declarar o
WSGI_APPLICATION = 'projectName.wsgi.application'
no seusettings.py
arquivo.fonte
Você pode realmente servir arquivos estáticos em um aplicativo Django de produção, com segurança e sem
DEBUG=True
.Em vez de usar o próprio Django, use dj_static no seu arquivo WSGI ( github ):
fonte
Basta abrir o projeto urls.py e, em seguida, encontre esta instrução if.
Você pode alterar o settings.DEBUG em True e ele sempre funcionará. Mas se o seu projeto é algo sério, você deve pensar em outras soluções mencionadas acima.
No django 1.10, você pode escrever assim:
fonte
Você pode depurar isso de várias maneiras diferentes. Aqui está a minha abordagem.
localsettings.py:
urls.py:
Certifique-se de ler os documentos;)
https://docs.djangoproject.com/en/2.0/howto/static-files/#limiting-use-to-debug-true
fonte
O suporte a argumentos de exibição de string para url () está obsoleto e será removido no Django 1.10
Minha solução é apenas uma pequena correção para a solução Conrado acima.
fonte
Embora não seja mais seguro, você pode alterar o código fonte. navegar para
Python/2.7/site-packages/django/conf/urls/static.py
Em seguida, edite da seguinte forma:
Portanto, se
settings.debug==False
não tiver efeito no código, também após a execução, tentepython manage.py runserver --runserver
executar arquivos estáticos.NOTA : As informações devem ser usadas apenas para teste apenas
fonte
Fiz as seguintes alterações no meu projeto / urls.py e funcionou para mim
Adicione esta linha: de django.conf.urls import url
e adicione: url (r '^ media / (? P. *) $', serve, {'document_root': settings.MEDIA_ROOT,}), em urlpatterns.
fonte