Como faço para incluir um stacktrace em minha página 500.html Django?

votos
20

Eu estou correndo Django 1.0e estou perto de implantar meu aplicativo. Como tal, eu vou estar mudando a configuração DEBUG como False.

Com isso dito, eu ainda gostaria de incluir o stacktrace na minha página 500.html quando ocorrem erros. Ao fazer isso, os usuários podem copiar-e-colar os erros e facilmente enviá-las para os desenvolvedores.

Quaisquer pensamentos sobre a melhor forma de abordar esta questão?

Publicado 23/09/2008 em 15:39
fonte usuário
Em outras línguas...                            


5 respostas

votos
15

Automaticamente registrar seus 500s, dessa forma:

  • Você sabe quando eles ocorrem.
  • Você não precisa contar com os usuários que enviam você stacktraces.

Joel recomenda mesmo indo bilhetes criando medida automaticamente no seu bug tracker quando seu aplicativo enfrenta uma falha. Pessoalmente, eu criar um feed RSS (privada) com as stacktraces, urls, etc. que os desenvolvedores podem se inscrever.

Mostrando rastreamentos de pilha para seus usuários, por outro lado poderia vazar informações que os usuários mal-intencionados poderiam usar para atacar o seu site. Excessivamente mensagens de erro detalhadas são uma das stepping stones clássicos para ataques de injeção SQL.

Editar (amostra de código adicionado para capturar traceback):

Você pode obter as informações de exceção da chamada sys.exc_info. Enquanto formatar o rastreamento para a exposição vem do módulo de rastreamento:

import traceback
import sys

try:
    raise Exception("Message")
except:
    type, value, tb = sys.exc_info()
    print >> sys.stderr,  type.__name__, ":", value
    print >> sys.stderr, '\n'.join(traceback.format_tb(tb))

Prints:

Exception : Message
  File "exception.py", line 5, in <module>
    raise Exception("Message")
Respondeu 23/09/2008 em 15:44
fonte usuário

votos
11

Como @zacherates diz, você realmente não deseja exibir um stacktrace para seus usuários. A abordagem mais fácil para este problema é o que Django faz por padrão, se você tem a si mesmo e seus desenvolvedores listados nos ADMINS configuração com endereços de e-mail; ele envia um e-mail a todos nessa lista com o rastreamento de pilha completa (e mais) cada vez que há um erro 500 com DEBUG = False.

Respondeu 23/09/2008 em 18:32
fonte usuário

votos
1

Se queremos mostrar exceções que são geradas, em ur modelo (500.html), então podemos escrever o seu próprio ponto de vista 500, agarrando a exceção e passá-la para o seu modelo 500.

Passos:

# .Em views.py:

import sys,traceback

def custom_500(request):
t = loader.get_template('500.html')

print sys.exc_info()
type, value, tb = sys.exc_info()
return HttpResponseServerError(t.render(Context({
'exception_value': value,
'value':type,
'tb':traceback.format_exception(type, value,
                                      tb)

}, RequestContext (request))))

# .Em principal Urls.py:

from django.conf.urls.defaults import *
handler500 = 'project.web.services.views.custom_500'

# Template .Em (500.html):

` exception_value ``value``tb`

mais sobre ele aqui: https://docs.djangoproject.com/en/dev/topics/http/views/#the-500-server-error-view

Respondeu 05/07/2013 em 08:50
fonte usuário

votos
1

Você poderia chamar sys.exc_info()em um manipulador de exceção personalizada. Mas eu não recomendo isso. Django pode enviar e-mails para exceções.

Respondeu 23/09/2008 em 15:46
fonte usuário

votos
0

Eu sei que isto é uma questão de idade, mas esses dias eu recomendo usar um serviço como o Sentry para capturar seus erros.

No Django, os passos para configurar isso são incrivelmente simples. De docs :

  • Instale Corvo usando pip install raven
  • Adicionar 'raven.contrib.django.raven_compat'ao seu settings.INSTALLED_APPS.
  • Adicionar RAVEN_CONFIG = {"dsn": YOUR_SENTRY_DSN}as suas configurações.

Então, na sua página 500 (definido no handler500), passar o request.sentry.idpara o modelo e seus usuários podem fazer referência ao erro específico, sem qualquer um dos seus componentes internos serem expostos.

Respondeu 09/03/2016 em 10:53
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more