Durante o desenvolvimento com Django, a variável DEBUG do arquivo settings.py fica com o valor True. Isto é útil pois quando ocorre algum erro, o Django nos mostra uma página com detalhes do erro, as chamadas dos métodos, valores de variáveis, etc.
Mas quando colocamos o sistema para rodar no servidor de produção devemos colocar DEBUG como False, pois o sistema já está pronto e sem problemas (hum... pelo menos deveria).
Mas caso ocorra algum erro de página não encontrada (erro 404) ou erro no servidor (erro 500) precisamos criar um template para mostrar uma mensagem amigável ao usuário. E o Django, como era de se esperar, já nos oferece os devidos templates prontos. Basta criar os arquivos 404.html e 500.html na raíz do diretório de templates e fazer uma chamada ao modelo pronto do Django. Cada arquivo irá conter apenas uma linha:
404.html:
{% extends "admin/404.html" %}
500.html:
{% extends "admin/500.html" %}
Isto já é (ou deveria ser) o suficiente para quem não quer ter o trabalho de montar suas próprias páginas de erros. A página de erro 404.html funciona perfeitamente. Nada o que reclamar. Porém a página 500.html não aparece "direito". É como se os arquivos estáticos (css, imagens, etc) não fossem lidos.
Pesquisando no Google descobri que nos casos onde ocorre erro 500 o Django não passa o RequestContext para o template. Consequentemente algumas variáveis não ficam disponíveis dentro do template, entre elas a MEDIA_URL.
Para contornar este problema a solução indicada foi re-escrever a view do Django que chama o template 500.html passando o MEDIA_URL. A view original está localizada em:
/caminho-para-seu-django/django/views/defaults.py
Dentro deste arquivo tem a função 'server_error'. Basta copiar esta função modificando apenas a linha do 'return'. O arquivo ficará assim:
from django.conf import settings
from django import http
from django.template import Context, loader
def server_error(request, template_name='500.html'):
"""
500 error handler.
Templates: `500.html`
Context:
MEDIA_URL
Path of static media (e.g. "media.example.org")
"""
# You need to create a 500.html template. t = loader.get_template(template_name)
return http.HttpResponseServerError(
t.render(Context({'MEDIA_URL': settings.MEDIA_URL})))
Agora é só salvá-lo em algum lugar no seu projeto. No meu caso, criei uma view na raíz do projeto. Depois, dentro do arquivo urls.py coloque a seguinte linha:
handler500 = 'seuprojeto.views.server_error'
Isso já é o suficiente. Uma vez que a variável DEBUG do settings.py esteja como False, a página de erro 500 será mostrada sem problemas. Além disso, caso as configurações de Email estejam configuradas no settings.py você receberá detalhes do erro em seu e-mail.
Mas é claro, assim como plano de saúde e seguro de automóvel, nós criamos o template 500 esperando que ele nunca seja utilizado =)

0 comentários:
Postar um comentário