Entonces, comencé a aprender a codificar en Python y luego en Django . Las primeras veces fue difícil analizar las trazas y descubrir qué hice mal y dónde estaba el error de sintaxis. Ha pasado algún tiempo ahora y en el camino, creo que tengo una rutina para depurar mi código Django. Como esto se hizo al principio de mi experiencia de codificación, me senté y me pregunté si lo que estaba haciendo no era efectivo y podría hacerse más rápido. Por lo general, logro encontrar y corregir los errores en mi código, pero me pregunto si debería hacerlo más rápido.
Por lo general, solo uso la información de depuración que Django proporciona cuando está habilitada. Cuando las cosas terminan como pensé, rompería mucho el flujo del código con un error de sintaxis, y miro las variables en ese punto del flujo para descubrir dónde el código hace algo diferente a lo que quería.
¿Pero se puede mejorar esto? ¿Hay algunas buenas herramientas o mejores formas de depurar su código de Django?
Respuestas:
Hay muchas formas de hacerlo, pero la más sencilla es simplemente usar el depurador de Python . Simplemente agregue la siguiente línea a una función de vista de Django:
o
Si intenta cargar esa página en su navegador, el navegador se bloqueará y recibirá un mensaje para continuar la depuración del código de ejecución real.
Sin embargo, hay otras opciones (no las recomiendo):
Pero el depurador de Python (pdb) es muy recomendable para todos los tipos de código Python. Si ya estás en pdb, también querrás echar un vistazo a IPDB que usa ipython para la depuración.
Algunas extensiones más útiles para pdb son
pdb ++ , sugerido por Antash .
pudb , sugerido por PatDuJour .
Usando el depurador de Python en Django , sugerido por Seafangs .
fuente
manage.py runserver --pdb
ymanage.py test --pdb
manda.ipython
también.Ipdb
, que viene conipython
funciones de finalización de pestañas, sintaxis coloreada y más :-).Realmente me gusta el depurador interactivo de Werkzeug . Es similar a la página de depuración de Django, excepto que obtienes un shell interactivo en cada nivel del rastreo. Si usa las extensiones django , obtiene un
runserver_plus
comando de administración que inicia el servidor de desarrollo y le proporciona el depurador de Werkzeug en excepciones.Por supuesto, solo debe ejecutar esto localmente, ya que le da a cualquier persona con un navegador los derechos para ejecutar código python arbitrario en el contexto del servidor.
fuente
python 3.3
Un pequeño resumen para las etiquetas de plantilla:
Ahora, dentro de una plantilla que puede hacer
{{ template_var|pdb }}
e ingresar a una sesión pdb (dado que está ejecutando el servidor de desarrollo local) donde puede inspeccionarelement
el contenido de su corazón.Es una forma muy agradable de ver qué le sucede a su objeto cuando llega a la plantilla.
fuente
Existen algunas herramientas que cooperan bien y pueden facilitar su tarea de depuración.
Lo más importante es la barra de herramientas de depuración de Django .
Entonces necesita un buen registro utilizando la función de registro de Python . Puede enviar la salida de registro a un archivo de registro, pero una opción más fácil es enviar la salida de registro a firepython . Para usar esto, debe usar el navegador Firefox con la extensión firebug . Firepython incluye un complemento firebug que mostrará cualquier registro del lado del servidor en una pestaña Firebug.
Firebug en sí también es fundamental para depurar el lado Javascript de cualquier aplicación que desarrolles. (Suponiendo que tenga algún código JS, por supuesto).
También me gustó django-viewtools para depurar vistas interactivamente usando pdb, pero no lo uso tanto.
Hay herramientas más útiles como Dozer para rastrear fugas de memoria (también hay otras buenas sugerencias dadas en las respuestas aquí en SO para el seguimiento de memoria).
fuente
Yo uso PyCharm (mismo motor pydev que eclipse). Realmente me ayuda a poder visualizar visualmente mi código y ver lo que está sucediendo.
fuente
Casi todo se ha mencionado hasta ahora, por lo que solo agregaré que en lugar de
pdb.set_trace()
uno puede usar ipdb.set_trace (), que usa iPython y, por lo tanto, es más poderoso (autocompletar y otras cosas). Esto requiere el paquete ipdb, por lo que solo necesitapip install ipdb
fuente
He empujado
django-pdb
a PyPI . Es una aplicación simple que significa que no necesita editar su código fuente cada vez que quiera ingresar a pdb.La instalación es solo ...
pip install django-pdb
'django_pdb'
a tuINSTALLED_APPS
Ahora puede ejecutar:
manage.py runserver --pdb
para entrar en pdb al comienzo de cada vista ...Y ejecute:
manage.py test --pdb
para entrar en pdb en fallas / errores de prueba ...El proyecto está alojado en GitHub , las contribuciones son bienvenidas, por supuesto.
fuente
La forma más fácil de depurar Python, especialmente para los programadores que están acostumbrados a Visual Studio, es usar PTVS (Herramientas de Python para Visual Studio). Los pasos son simples:
Si desea depurar Django usando PTVS, debe hacer lo siguiente:
fuente
Uso pyDev con Eclipse realmente bueno, establezco puntos de interrupción, paso al código, veo valores en cualquier objeto y variable, lo intento.
fuente
Uso PyCharm y lo mantengo todo el tiempo. Me costó un poco, pero debo decir que la ventaja que obtengo no tiene precio. Intenté depurar desde la consola y le doy mucho crédito a las personas que pueden hacerlo, pero para mí poder depurar visualmente mis aplicaciones es genial.
Sin embargo, debo decir que PyCharm requiere mucha memoria. Pero, de nuevo, nada bueno es gratis en la vida. Acaban de llegar con su última versión 3. También funciona muy bien con Django, Flask y Google AppEngine. Entonces, en general, diría que es una gran herramienta útil para cualquier desarrollador.
Si aún no lo está utilizando, le recomiendo que obtenga la versión de prueba durante 30 días para ver el poder de PyCharm. Estoy seguro de que también hay otras herramientas disponibles, como Aptana. Pero supongo que también me gusta la apariencia de PyCharm. Me siento muy cómodo depurando mis aplicaciones allí.
fuente
A veces, cuando quiero explorar un método en particular y convocar pdb es demasiado engorroso, agrego:
IPython.embed()
inicia un shell de IPython que tiene acceso a las variables locales desde el punto donde lo llama.fuente
from IPython import embed
y, cuando quiera agregar rápidamente un punto de interrupción en el código, escriboembed()
. Ahorra tiempo. Para evitar quedar atrapado en bucles para siempre, lo hagoembed();exit();
pudb
ydebugger;
en JavaScript) en el archivo que estoy editando. Después de que termine, simplementedd
(elimino toda la línea) para eliminar el punto de interrupción. Esto evita el riesgo de comprometer la línea de importación del depurador en el control de versiones o tener que preestablecer la importación primero en la parte superior del archivo.Desde mi perspectiva, podríamos dividir las tareas comunes de depuración de código en tres patrones de uso distintos:
assert False
el lugar en el que desea detenerse.import pudb; pudb.set_trace()
. La principal ventaja sobre [i] pdb es que PuDB (mientras te ves en los años 80) hace que configurar expresiones de reloj personalizadas sea muy fácil. Y depurar un montón de bucles anidados es mucho más simple con una GUI.Ah, sí, los problemas de las plantillas. El problema más común (para mí y mis colegas) es un contexto incorrecto: o no tienes una variable o tu variable no tiene algún atributo. Si está utilizando la barra de herramientas de depuración , simplemente inspeccione el contexto en la sección "Plantillas" o, si no es suficiente, establezca un salto en el código de sus vistas justo después de que se complete su contexto.
Así que va.
fuente
import pudb;pu.db
Recomiendo epdb (depurador de Python extendido).
https://bitbucket.org/dugan/epdb
Una cosa que me encanta de epdb para depurar Django u otros servidores web Python es el comando epdb.serve (). Esto establece un seguimiento y lo sirve en un puerto local al que puede conectarse. Caso de uso típico:
Tengo una opinión que quiero ver paso a paso. Insertaré lo siguiente en el punto en que quiero establecer la traza.
Una vez que se ejecuta este código, abro un intérprete de Python y me conecto a la instancia de servicio. Puedo analizar todos los valores y recorrer el código usando los comandos pdb estándar como n, s, etc.
Y toneladas más que puede aprender sobre cómo escribir ayuda de epdb en cualquier momento.
Si desea servir o conectarse a varias instancias de epdb al mismo tiempo, puede especificar el puerto para escuchar (el valor predeterminado es 8080). Es decir
host por defecto es 'localhost' si no se especifica. Lo lancé aquí para demostrar cómo puede usar esto para depurar algo que no sea una instancia local, como un servidor de desarrollo en su LAN local. ¡Obviamente, si hace esto, tenga cuidado de que la traza establecida nunca llegue a su servidor de producción!
Como nota rápida, aún puede hacer lo mismo que la respuesta aceptada con epdb (
import epdb; epdb.set_trace()
), pero quería resaltar la funcionalidad de publicación, ya que la he encontrado muy útil.fuente
Acabo de encontrar wdb ( http://www.rkblog.rk.edu.pl/w/p/debugging-python-code-browser-wdb-debugger/?goback=%2Egde_25827_member_255996401 ). Tiene una interfaz de usuario / GUI bastante agradable con todas las campanas y silbatos. El autor dice esto sobre wdb -
"Hay IDE como PyCharm que tienen sus propios depuradores. Ofrecen un conjunto de características similares o iguales ... Sin embargo, para usarlos hay que usar esos IDE específicos (y algunos de ellos no son gratuitos o pueden no estar disponibles para todos). plataformas). Elija la herramienta adecuada para sus necesidades ".
Pensé que lo transmitiría.
También un artículo muy útil sobre depuradores de python: https://zapier.com/engineering/debugging-python-boss/
Finalmente , si desea ver una buena impresión gráfica de su pila de llamadas en Django, consulte: https://github.com/joerick/pyinstrument . Simplemente agregue pyinstrument.middleware.ProfilerMiddleware a MIDDLEWARE_CLASSES, luego agregue? Profile al final de la URL de solicitud para activar el generador de perfiles.
También puede ejecutar pyinstrument desde la línea de comandos o importando como módulo.
fuente
Agregue
import pdb; pdb.set_trace()
obreakpoint()
(form python3.7) en la línea correspondiente en el código Python y ejecútelo. La ejecución se detendrá con un shell interactivo. En el shell puede ejecutar código Python (es decir, variables de impresión) o usar comandos como:c
continuar ejecutandon
pasar a la siguiente línea dentro de la misma funcións
paso a la siguiente línea en esta función o una función llamadaq
salir del depurador / ejecuciónVer también: https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28
fuente
Una de sus mejores opciones para depurar el código de Django es a través de wdb: https://github.com/Kozea/wdb
Instale y ejecute el servidor, y en su código agregue:
Según el autor, las principales diferencias con respecto a
pdb
son:Tiene una excelente interfaz de usuario basada en navegador. Una alegría de usar! :)
fuente
Yo uso PyCharm y diferentes herramientas de depuración. También tenga un buen conjunto de artículos sobre cómo configurar fácilmente esas cosas para los principiantes. Puedes comenzar aquí. Cuenta sobre la depuración de PDB y GUI en general con proyectos de Django. Espero que alguien se beneficie de ellos.
fuente
Si usa Aptana para el desarrollo de Django, mire esto: http://www.youtube.com/watch?v=qQh-UQFltJQ
Si no, considere usarlo.
fuente
La mayoría de las opciones ya se mencionan. Para imprimir el contexto de la plantilla, he creado una biblioteca simple para eso. Ver https://github.com/edoburu/django-debugtools
Puede usarlo para imprimir el contexto de la plantilla sin ninguna
{% load %}
construcción:Utiliza un formato pprint personalizado para mostrar las variables en una
<pre>
etiqueta.fuente
Creo que Visual Studio Code es increíble para depurar aplicaciones de Django. Los parámetros estándar de Python launch.json se ejecutan
python manage.py
con el depurador adjunto, por lo que puede establecer puntos de interrupción y recorrer su código a su gusto.fuente
Para aquellos que accidentalmente pueden agregar pdb en commits en vivo, puedo sugerir esta extensión de respuesta #Koobz:
fuente
Desde mi propia experiencia, hay dos maneras:
use ipdb , que es un depurador mejorado que le gusta pdb.
import ipdb;ipdb.set_trace()
obreakpoint()
(de python3.7)use django shell, solo use el comando a continuación. Esto es muy útil cuando está desarrollando una nueva vista.
python manage.py shell
fuente
Recomiendo utilizar PDB.
Puede inspeccionar todos los valores de las variables, ingresar a la función y mucho más. https://docs.python.org/2/library/pdb.html
para verificar todo tipo de solicitud, respuesta y visitas a la base de datos. Estoy usando django-debug-toolbar https://github.com/django-debug-toolbar/django-debug-toolbar
fuente
Como se mencionó en otras publicaciones aquí, establecer puntos de interrupción en su código y recorrerlo para ver si se comporta como esperaba es una excelente manera de aprender algo como Django hasta que tenga una buena idea de cómo se comporta todo y cuál es su código está haciendo.
Para hacer esto, recomendaría usar WingIde. Al igual que otros IDEs mencionados, agradables y fáciles de usar, un diseño agradable y también puntos de interrupción fáciles de configurar, evaluar / modificar la pila, etc. Perfecto para visualizar lo que está haciendo su código a medida que avanza. Soy un gran admirador de eso.
También uso PyCharm: tiene un excelente análisis de código estático y a veces puede ayudar a detectar problemas antes de que te des cuenta de que están allí.
Como ya se mencionó, django-debug-toolbar es esencial: https://github.com/django-debug-toolbar/django-debug-toolbar
Y aunque no es explícitamente una herramienta de depuración o análisis, uno de mis favoritos es SQL Printing Middleware disponible de Django Snippets en https://djangosnippets.org/snippets/290/
Esto mostrará las consultas SQL que ha generado su vista. Esto le dará una buena idea de lo que está haciendo el ORM y si sus consultas son eficientes o si necesita volver a trabajar su código (o agregar almacenamiento en caché).
Me resulta invaluable para vigilar el rendimiento de las consultas al desarrollar y depurar mi aplicación.
Solo otro consejo: lo modifiqué ligeramente para mi propio uso para mostrar solo el resumen y no la instrucción SQL ... Así que siempre lo uso durante el desarrollo y las pruebas. También agregué que si el len (connection.queries) es mayor que un umbral predefinido, muestra una advertencia adicional.
Luego, si veo que algo malo (desde una perspectiva de rendimiento o número de consultas) está sucediendo, vuelvo a la pantalla completa de las declaraciones SQL para ver exactamente lo que está sucediendo. Muy útil cuando estás trabajando en un gran proyecto de Django con múltiples desarrolladores.
fuente
usar
pdb
oipdb
. La diferencia entre estos dos es ipdb admite autocompletar.para pdb
para ipdb
Para ejecutar la nueva
n
tecla de golpe de línea , para continuar lac
tecla de golpe . verifique más opciones usandohelp(pdb)
fuente
Una sugerencia adicional.
Puede aprovechar las pruebas de nariz y pdb juntas, en lugar de inyectar
pdb.set_trace()
en sus vistas manualmente. La ventaja es que puede observar condiciones de error cuando se inician por primera vez, potencialmente en código de terceros.Aquí hay un error para mí hoy.
Ahora, sé que esto significa que engañé al constructor del formulario, e incluso tengo una buena idea de qué campo es un problema. Pero, ¿puedo usar pdb para ver de qué formas crujientes se queja, dentro de una plantilla ?
Sí, puedo. Utilizando el --pdb opción en nosetests:
tests$ nosetests test_urls_catalog.py --pdb
Tan pronto como llego a alguna excepción (incluidas las que se manejan con gracia), pdb se detiene donde sucede y puedo mirar alrededor.
Ahora, está claro que mi argumento de elección para el constructor de campo crujiente fue como una lista dentro de una lista, en lugar de una lista / tupla de tuplas.
Lo bueno es que este pdb se lleva a cabo dentro del código de crispy, no el mío y no tuve que insertarlo manualmente.
fuente
Durante el desarrollo, agregando un rápido
puede ayudar a diagnosticar problemas en las vistas o en cualquier otro lugar, sin la necesidad de usar un depurador.
fuente