Pergunta

Estou correndo Django 1.0 e 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.

Qualquer pensamento sobre a melhor forma de abordar esta questão?

Foi útil?

Solução

Automaticamente registrar seus 500s, dessa forma:

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

Joel recomenda mesmo indo tão longe como automaticamente a criação de bilhetes em 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 detalhado mensagens de erro são uma das stepping stones clássicos para ataques de injeção SQL.

Editar (exemplo de código adicionado ao rastreamento de captura):

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")

Outras dicas

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 nas 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.

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 urls.py principal:

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

# Em Modelo (500.html):

{{ exception_value }}{{value}}{{tb}}

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

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.

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 os 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} com suas configurações.

Em seguida, na página 500 (definido no handler500), passe a request.sentry.id para o modelo e seus usuários podem fazer referência ao erro específico, sem qualquer um dos seus componentes internos serem expostos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top