Header Ads Widget

Ticker

6/recent/ticker-posts

Usando Sentry para manejar excepciones de Python en proyectos de Django

Las aplicaciones web creadas en Django pueden volverse enormemente complejas con el tiempo, que es una de las razones por las que el manejo centralizado de errores es importante. Este tutorial lo guiará para agregar una configuración Sentry básica y gratuita a un nuevo proyecto de Django.

Cuando terminemos, podrá ver informes de errores centralizados en el panel de Sentry como se ve en esta captura de pantalla:

Panel de control de Sentry con excepciones de Django detectadas.

Requisitos del tutorial

A lo largo de este tutorial vamos a utilizar las siguientes dependencias, que instalaremos en un momento. Asegúrese de tener también Python 3, preferiblemente 3.7 o más reciente instalado , en su entorno:

Usaremos las siguientes dependencias para completar este tutorial:

Todo el código de esta publicación de blog está disponible en código abierto bajo la licencia MIT en GitHub en el directorio sentry-handle-exceptions-django-projects del repositorio blog-code-examples . Utilice el código fuente como desee para sus propios proyectos.

Configuración del entorno de desarrollo

Cambie al directorio donde guarda sus entornos virtuales de Python Cree un nuevo virtualenv para este proyecto usando el siguiente comando.

Inicie el proyecto Django creando un nuevo entorno virtual usando el siguiente comando. Recomiendo usar un directorio separado como ~/venvs/(la tilde es un atajo para el home directorio de su usuario ) para que siempre sepa dónde se encuentran todos sus virtualenvs.

python3 -m venv ~ / venvs / djsentry

Active virtualenv con el activatescript de shell:

fuente ~ / venvs / djsentry / bin / enable

Después de que se ejecute el comando anterior, el símbolo del sistema cambiará de modo que el nombre del virtualenv se anteponga al formato original del símbolo del sistema, por lo que si su mensaje es simple $, ahora se verá así:

(djsentry) $

Recuerde, debe activar su virtualenv en cada nueva ventana de terminal donde quiera usar dependencias en virtualenv.

Ahora podemos instalar el paquete Django en el virtualenv activado pero vacío.

pip instalar django == 3.1 sentry-sdk == 0.16.5

Busque un resultado similar al siguiente para confirmar que los paquetes adecuados se instalaron correctamente desde PyPI.

(djsentry) $ pip instalar django == 3.1 sentry-sdk == 0.16.5
Coleccionando django
  Descargando https://files.pythonhosted.org/packages/2b/5a/4bd5624546912082a1bd2709d0edc0685f5c7827a278d806a20cf6adea28/Django-3.1-py3-none-any.whl (7.8MB)
    100% | ██████████████████████████████ | 7,8 MB 6,3 MB / s
Recogiendo sentry-sdk
  Descargando https://files.pythonhosted.org/packages/f4/4c/49f899856e3a83e02bc88f2c4945aa0bda4f56b804baa9f71e6664a574a2/sentry_sdk-0.16.5-py2.py3-none-any.whl (113kB)
    100% | ██████████████████████████████ | 122 kB 33,7 MB / s
Recopilando asgiref ~ = 3.2.10 (de django)
  Usando https://files.pythonhosted.org/packages/d5/eb/64725b25f991010307fd18a9e0c1f0e6dff2f03622fc4bcbcdb2244f60d6/asgiref-3.2.10-py3-none-any.whl almacenado en caché
Recopilando sqlparse> = 0.2.2 (de django)
  Usando https://files.pythonhosted.org/packages/85/ee/6e821932f413a5c4b76be9c5936e313e4fc626b33f16e027866e1d60f588/sqlparse-0.3.1-py2.py3-none-any.whl almacenado en caché
Recolectando pytz (de django)
  Usando https://files.pythonhosted.org/packages/4f/a4/879454d49688e2fad93e59d7d4efda580b783c745fd2ec2a3adf87b0808d/pytz-2020.1-py2.py3-none-any.whl almacenado en caché
Recopilando urllib3> = 1.10.0 (de sentry-sdk)
  Usando https://files.pythonhosted.org/packages/9f/f0/a391d1463ebb1b233795cabfc0ef38d3db4442339de68f847026199e69d7/urllib3-1.25.10-py2.py3-none-any.whl almacenado en caché
Recopilación de certifi (de sentry-sdk)
  Usando https://files.pythonhosted.org/packages/5e/c4/6c4fe722df5343c33226f0b4e0bb042e4dc13483228b4718baf286f86d87/certifi-2020.6.20-py2.py3-none-any.whl almacenado en caché
Instalación de paquetes recopilados: asgiref, sqlparse, pytz, django, urllib3, certifi, sentry-sdk
Se instaló correctamente asgiref-3.2.10 certifi-2020.6.20 django-3.1 pytz-2020.1 sentry-sdk-0.16.5 sqlparse-0.3.1 urllib3-1.25.10

Podemos comenzar a codificar la aplicación ahora que tenemos todas nuestras dependencias requeridas instaladas.

Codificación de la aplicación inicial

Tenemos todo lo que necesitamos para comenzar a construir nuestra aplicación.

Podemos usar la herramienta Django django-admin para crear la estructura de código estándar para comenzar nuestro proyecto. Cambie al directorio donde desarrolla sus aplicaciones. Por ejemplo, normalmente lo uso /Users/matt/devel/py/para todos mis proyectos de Python. Luego ejecute el siguiente comando para iniciar un proyecto de Django llamado djsentry:

django-admin.py startproject djsentry

Tenga en cuenta que en este tutorial estamos usando el mismo nombre para el directorio de proyectos virtualenv y Django, pero pueden tener nombres diferentes si lo prefiere para organizar sus propios proyectos.

El django-admincomando crea un directorio nombrado djsentry junto con varios subdirectorios con los que debería estar familiarizado si ha trabajado anteriormente con Django.

Cambie de directorio al nuevo proyecto.

cd djsentry

Crea una nueva aplicación Django dentro de djsentry.

errores de python manage.py startapp

Django generará una nueva carpeta con el nombre errorsdel proyecto. Deberíamos actualizar las URL para que la aplicación sea accesible antes de escribir nuestro views.pycódigo.

Abierta djsentry/djsentry/urls.pyAgregue las líneas resaltadas para que el solucionador de URL verifique la errorsaplicación en busca de rutas adicionales que coincidan con las URL solicitadas de esta aplicación de Django.

# djsentry / djsentry / urls.py
 de django.conf.urls import include
desde django.contrib import admin
desde la ruta de importación django.urls


urlpatterns = [
    ruta ('', include ('errors.urls')),
    ruta ('admin /', admin.site.urls),
]

Guardar djsentry/djsentry/urls.pyy abrir djsentry/djsentry/settings.pyAgregue la errorsaplicación settings.pyinsertando la línea resaltada:

# djsentry / djsentry / settings.py
# Definición de la aplicación

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'errores',
]

Asegúrese de cambiar los valores predeterminados DEBUGantes de implementar cualquier código en producción. Asegure su aplicación correctamente con la información de la lista de verificación de implementación de producción de Django para que no agregue su proyecto a la lista de aplicaciones pirateadas en la web.SECRET_KEYsettings.py

Guardar y cerrar settings.py.

A continuación, cambie al djsentry/errorsdirectorio. Cree un nuevo archivo llamado urls.pypara contener rutas para la errorsaplicación.

Agregue todas estas líneas al djsentry/errors/urls.py archivo vacío .

# djsentry / errors / urls.py
de la url de importación django.conf.urls
desde . importar vistas

urlpatterns = [
    url (r '^ $' , views.errors_index, name = "index"),
]

Guardar djsentry/errors/urls.pyAbra djsentry/errors/views.pypara agregar las siguientes dos líneas resaltadas. Puede mantener el comentario estándar "# Cree sus vistas aquí". o borrar como suelo hacer.

# djsentry / errors / views.py
desde django.shortcuts import render


def errors_index (solicitud): 
    return render (solicitud, 'index.html', {})

A continuación, cree un directorio para sus archivos de plantilla con el nombre templatesdel djmaps/mapsdirectorio de la aplicación.

plantillas mkdir

Cree un nuevo archivo con el nombre index.htmldentro djsentry/errors/templatesque contenga el siguiente lenguaje de marcado de plantilla de Django .

<! DOCTYPE html>
<html>
  <cabeza>
    <title> Primer paso para errores </ title>
   </ head>
  <cuerpo>
   <h1> ¡Hola, mundo! </ h1>
   </ cuerpo>
 </ html>

Podemos probar esta página estática para asegurarnos de que todo nuestro código sea correcto antes de comenzar a agregar la esencia de la funcionalidad al proyecto. Cambie al directorio base de su proyecto Django donde manage.pyse encuentra el archivo. Ejecute el servidor de desarrollo con el siguiente comando:

python manage.py runserver

El servidor de desarrollo de Django debería iniciarse sin problemas más que una advertencia de migraciones no aplicadas.

Observación de cambios de archivos con StatReloader
Realización de comprobaciones del sistema ...

La verificación del sistema no identificó problemas (0 silenciados).

Tiene 18 migración (es) sin aplicar. Es posible que su proyecto no funcione correctamente hasta que aplique las migraciones para las aplicaciones: administrador, autenticación, tipos de contenido, sesiones.
Ejecute 'python manage.py migrate' para aplicarlos.
15 de agosto de 2020-17: 26: 57
Django versión 3.1, usando la configuración 'djsentry.settings'
Iniciando el servidor de desarrollo en http://127.0.0.1:8000/
Salga del servidor con CONTROL-C.

Abra un navegador web y vaya a localhost:8000.

Página HTML vieja y simple que dice "¡Hola, mundo!".

Nuestro código funciona, pero seguro que todavía no hace mucho. Agreguemos sentry-sdk para que podamos entender cómo funciona.

Añadiendo Sentry y la biblioteca sentry-sdk

Ahora podemos agregar Sentry y probarlo con un montón de errores para asegurarnos de que funciona correctamente.

Sentry o bien puede ser alojado en sí mismo o se utiliza como un servicio en la nube a través de Sentry.io . En este tutorial usaremos la versión alojada en la nube porque es más rápida que configurar su propio servidor y es gratuita para proyectos más pequeños.

Ve a la página de inicio de Sentry.io .

Página de inicio de Sentry.io donde puede registrarse para obtener una cuenta gratuita.

Inicie sesión en su cuenta o regístrese para obtener una nueva cuenta gratuita. Estará en el panel principal de la cuenta después de iniciar sesión o completar el proceso de registro de Sentry.

Todavía no hay errores registrados en el panel de nuestra cuenta, lo cual es lo esperado porque aún no hemos conectado nuestra cuenta a nuestro proyecto Django.

Panel de cuenta de Sentry en blanco.

Cree un nuevo Proyecto Sentry solo para esta aplicación haciendo clic en "Proyectos" en la barra lateral izquierda para ir a la página Proyectos.

Botón para crear un nuevo proyecto Sentry.

En la página Proyectos, haga clic en el botón "Crear proyecto" en la esquina superior derecha de la página.

Crea un nuevo proyecto Sentry.

Puede elegir "Django" o seleccionar "Python". Por lo general, elijo "Python" si aún no sé qué marco usaré para construir mi aplicación. A continuación, asigne un nombre a su nuevo proyecto y luego presione el botón "Crear proyecto". Nuestro nuevo proyecto está listo para integrarse con nuestro código Python.

Necesitamos el identificador único de nuestra cuenta y proyecto para autorizar a nuestro código Python a enviar errores a esta instancia de Sentry. La forma más fácil de obtener lo que necesitamos es ir a la página de documentación de Python + Django y leer cómo configurar el SDK.

Los documentos de Sentry le muestran exactamente lo que necesita exportar para conectarse a su cuenta.

Copie el parámetro de cadena para el initmétodo y configúrelo como una variable de entorno en lugar de exponerlo en el código de su proyecto.

exportar SENTRY_DSN = 'https: //yourkeygoeshere.ingest.sentry.io/project-number'

Asegúrese de reemplazar "yourkeygoeshere" con su propio identificador único y "project-number" con el ID que coincida con el proyecto que acaba de crear.

Verifique que SENTRY_DSNesté configurado correctamente en su shell usando el echo comando:

echo $ SENTRY_DSN

A continuación, actualice settings.pycon las siguientes líneas nuevas resaltadas:

# settings.py
 import os 
import sentry_sdk

desde la ruta de importación de pathlib
de sentry_sdk.integrations.django importar DjangoIntegration


# Construya rutas dentro del proyecto de esta manera: BASE_DIR / 'subdir'.
BASE_DIR = Ruta (__ archivo __). Resolver (estricto = Verdadero) .parent.parent

En la parte inferior del archivo después de la línea con STATIC_URL, agregue la configuración Sentry:

STATIC_URL = '/ static /'

sentry_sdk.init ( 
    dsn = os.getenv ('SENTRY_DSN'), 
    integraciones = [DjangoIntegration ()],

    # Si desea asociar usuarios a errores (asumiendo que está usando 
    # django.contrib.auth) puede habilitar el envío de datos PII. 
    send_default_pii = Verdadero 
)

Ahora que tenemos la configuración en su lugar, podemos deliberadamente cometer algunos errores para probar la conexión al servicio de Sentry.

Prueba de detección de errores de Sentry

Cambiaremos parte del código existente para lanzar excepciones deliberadamente para asegurarnos de que todo funcione correctamente.

Comience abriendo errors/views.pyy actualizándolo con una nueva línea resaltada que arrojará automáticamente una excepción genérica cuando se llame a esta función.

# djsentry / errors / views.py
desde django.shortcuts import render


def errors_index (solicitud):
    raise Exception ('excepción de prueba')
    return render (solicitud, 'index.html', {})

Vaya a localhost:8000en su navegador e inmediatamente obtendrá esta página de excepción cuando ejecute el servidor de desarrollo:

Página de depuración del modo de desarrollo de Django cuando se genera la excepción.

También podemos probar código que no solo genere una excepción, sino que definitivamente creará una cuando se ejecute, como esta operación de división por cero:

# djsentry / errors / views.py
desde django.shortcuts import render


def errors_index (solicitud):
    division_by_zero = 1/0
    return render (solicitud, 'index.html', {})

Página de depuración del modo de desarrollo de Django cuando se produce la excepción.

Si ambas excepciones aparecen en el panel de Sentry de esta manera, ya está todo listo:

Panel de Sentry con las excepciones que acaban de ocurrir.

Las excepciones anteriores fueron solo un par de formas genéricas de probar que todo funciona para enviar información de error a Sentry. Esta configuración también manejará las muchas otras excepciones de Django que probablemente verá al compilar el resto de su proyecto Django.

Publicar un comentario

0 Comentarios