¿Cómo depurar en Django, la buena manera? [cerrado]

587

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?

googletorp
fuente
2
me gusta usar django-debug-toolbar, es muy útil
Diego Vinícius
1
O use el depurador de Python integrado de Visual Studio Code como se explica aquí code.visualstudio.com/docs/python/tutorial-django
Nick T

Respuestas:

536

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:

import pdb; pdb.set_trace()

o

breakpoint()  #from Python3.7

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

* return HttpResponse({variable to inspect})

* print {variable to inspect}

* raise Exception({variable to inspect})

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 .

simplemente duro
fuente
64
+1 por sugerir pdb. Sin embargo, vale la pena señalar que esto solo funciona realmente cuando se usa el servidor de desarrollo en su máquina local, ya que el mensaje aparecerá en la consola.
Daniel Roseman
12
Ver también django-pdb según mi respuesta a continuación. Te da manage.py runserver --pdby manage.py test --pdbmanda.
Tom Christie
44
@Daniel, mira rconsole para tener una consola en una instancia de Python que ya está en ejecución.
Phob
12
Echa un vistazo ipythontambién. Ipdb, que viene con ipythonfunciones de finalización de pestañas, sintaxis coloreada y más :-).
hobbes3
3
Encontré su respuesta útil, pero Django estaba colgado para siempre en mis puntos de interrupción, cuando intentaba depurar una prueba. Así que busqué y encontré un artículo informativo que me ayudó: v3.mike.tig.as/blog/2010/09/14/pdb
driftcatcher
228

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

Benjamin Wohlwend
fuente
2
¿Es posible utilizar la finalización de pestañas en la consola interactiva que se muestra en el navegador? "Tab" solo nos lleva a la próxima consola abierta, me preguntaba si había una combinación de teclas, pero no pude encontrar una.
Ariel
@Ariel, el depurador de werkzeug no tiene la pestaña completada.
Håken Lid
Si está depurando API, puede probar django-rundbg que agrega un pequeño giro al depurador Werkzeug.
elpaquete
Solo depende depython 3.3
Timo
no es compatible con canales github.com/pallets/werkzeug/issues/1322
Paolo
166

Un pequeño resumen para las etiquetas de plantilla:

@register.filter 
def pdb(element):
    import pdb; pdb.set_trace()
    return element

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 inspeccionar elementel contenido de su corazón.

Es una forma muy agradable de ver qué le sucede a su objeto cuando llega a la plantilla.

Koobz
fuente
1
esto es genial. Otra cosa que puede hacer si tiene problemas con las plantillas es cambiar a jinja2 (cargado a través del ataúd): es una extensión de las plantillas de django, lo cual es una mejora en mi opinión. También integra plantillas y herencia de plantillas en marcos de rastreo mucho mejor que django.
Fastmultiplication
Esto es adorable. Desafortunadamente, es difícil ver una forma limpia de integrar esto en una base de código que rechaza cualquier confirmación, incluida una importación de pdb.
Jon Kiparsky
83

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

Van Gale
fuente
65

Yo uso PyCharm (mismo motor pydev que eclipse). Realmente me ayuda a poder visualizar visualmente mi código y ver lo que está sucediendo.

PhoebeB
fuente
2
Lo mejor de todo es que simplemente funciona y es totalmente intuitivo. Simplemente haga clic a la izquierda de una línea y presione el botón de depuración. También funciona bien para el código fuente de Django si desea comprender mejor cómo funciona el código interno. Me llevó un tiempo darme cuenta, pero puede poner puntos de interrupción en cualquiera de los códigos en la carpeta Bibliotecas externas del navegador de archivos.
Michael Bylstra el
66
Vale la pena mencionar que PyCharm utiliza el depurador PyDev bajo el capó para obtener créditos.
Medeiros el
1
stackoverflow.com/a/28256637/4366229
Martin Alexandersson
44

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

Tomasz Zieliński
fuente
2
Recomiendo pdb ++ que proporciona un modo adhesivo muy útil.
Sandeep
34

He empujado django-pdba 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 ...

  1. pip install django-pdb
  2. Añadir 'django_pdb'a tuINSTALLED_APPS

Ahora puede ejecutar: manage.py runserver --pdbpara entrar en pdb al comienzo de cada vista ...

bash: manage.py runserver --pdb
Validating models...

0 errors found
Django version 1.3, using settings 'testproject.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

GET /
function "myview" in testapp/views.py:6
args: ()
kwargs: {}

> /Users/tom/github/django-pdb/testproject/testapp/views.py(7)myview()
-> a = 1
(Pdb)

Y ejecute: manage.py test --pdbpara entrar en pdb en fallas / errores de prueba ...

bash: manage.py test testapp --pdb
Creating test database for alias 'default'...
E
======================================================================
>>> test_error (testapp.tests.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File ".../django-pdb/testproject/testapp/tests.py", line 16, in test_error
    one_plus_one = four
NameError: global name 'four' is not defined
======================================================================

> /Users/tom/github/django-pdb/testproject/testapp/tests.py(16)test_error()
-> one_plus_one = four
(Pdb)

El proyecto está alojado en GitHub , las contribuciones son bienvenidas, por supuesto.

Tom Christie
fuente
3
Esto sería genial si pudiera especificar el número de archivo / línea para dividir (no solo la vista).
Anson MacKeracher
A lo que podría dejar en el código como comentarios de los cuales son inertes dentro de la producción. Tal vez este sea un mal paradim, pero sería genial despojar y aplicar descansos de manera efectiva.
Glicerina
Instalé esto recientemente, pero solo hoy descubrí configurar "POST_MORTEM = True" en mi configuración de desarrollo como lo documenta el django-pdb de Tom. Ahora puedo simplemente navegar y cuando las cosas van mal me caen directamente a la ubicación del problema. Gracias tom!
Joseph Sheedy
21

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:

  1. Descárguelo e instálelo desde http://pytools.codeplex.com/
  2. Establezca puntos de interrupción y presione F5.
  3. Su punto de interrupción es alcanzado, puede ver / cambiar las variables tan fácilmente como depurar programas C # / C ++.
  4. Eso es todo :)

Si desea depurar Django usando PTVS, debe hacer lo siguiente:

  1. En Configuración del proyecto - pestaña General, configure "Archivo de inicio" en "manage.py", el punto de entrada del programa Django.
  2. En Configuración del proyecto - pestaña Depurar, establezca "Argumentos de script" en "runserver --noreload". El punto clave es el "--noreload" aquí. Si no lo configura, sus puntos de interrupción no serán alcanzados.
  3. Disfrútala.
029xue
fuente
1
Gracias, eso funcionó muy bien. El --noreload era lo que necesitábamos
Tom Gruner
¿Hay una función para depurar en el servidor remoto, similar a Eclipse PyDev que uso en este momento?
Daniel Sokolowski
Estoy teniendo problemas con esto. Seguí tus pasos pero aún no funciona. Solo se detiene en los puntos de interrupción de los archivos * .py, no en los * .html.
blfuentes
16

Uso pyDev con Eclipse realmente bueno, establezco puntos de interrupción, paso al código, veo valores en cualquier objeto y variable, lo intento.

gath
fuente
Debe ejecutar el servidor de desarrollo a través de eclipse (para la experiencia de depuración de bajo esfuerzo). PyDev afirma tener una depuración remota, pero como nunca la he usado, realmente no puedo hablar de la calidad de la experiencia de desarrollo. Detalles: pydev.org/manual_adv_remote_debugger.html
sintetizadorpatel
2
El depurador remoto de PyDev funciona maravillosamente con el servidor de desarrollo de Django. Solo asegúrese de tener el mensaje "Cuando se cambia el archivo, ¿cargar automáticamente el módulo?" opción '' deshabilitado '' en la configuración de ejecución / depuración de PyDev. De lo contrario, el servidor de desarrollo y pydev intentarán volver a cargar el código mientras está depurando, lo que los confundirá mucho.
coredumperror
12

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

Kan
fuente
Podría ser el primer IDE que compro. Depurar un proyecto en una VM suena como magia por la que vale la pena pagar.
Rob Grant
10

A veces, cuando quiero explorar un método en particular y convocar pdb es demasiado engorroso, agrego:

import IPython; IPython.embed()

IPython.embed() inicia un shell de IPython que tiene acceso a las variables locales desde el punto donde lo llama.

Lie Ryan
fuente
Ahora tengo la costumbre de hacer esto en la parte superior del archivo from IPython import embedy, cuando quiera agregar rápidamente un punto de interrupción en el código, escribo embed(). Ahorra tiempo. Para evitar quedar atrapado en bucles para siempre, lo hagoembed();exit();
Mayank Jaiswal
@MayankJaiswal: tenía una asignación de teclas en Vim para insertar este fragmento (y fragmentos similares para pudby debugger;en JavaScript) en el archivo que estoy editando. Después de que termine, simplemente dd(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.
Mentira Ryan
10

Desde mi perspectiva, podríamos dividir las tareas comunes de depuración de código en tres patrones de uso distintos:

  1. Algo ha provocado una excepción : runserver_plus 'depurador Werkzeug al rescate. La capacidad de ejecutar código personalizado en todos los niveles de rastreo es mortal. Y si está completamente atascado, puede crear una Gist para compartir con solo un clic.
  2. Se muestra la página, pero el resultado es incorrecto : nuevamente, Werkzeug es genial. Para hacer un punto de interrupción en el código, simplemente escriba assert Falseel lugar en el que desea detenerse.
  3. El código funciona mal , pero el vistazo rápido no ayuda. Lo más probable, un problema algorítmico. Suspiro. A continuación, por lo general el fuego de una consola depurador PuDB : 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.

Alex Morozov
fuente
escribir menos usando soloimport pudb;pu.db
Sławomir Lenart
6

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.

import epdb; epdb.serve()

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.

In [2]: import epdb; epdb.connect()
(Epdb) request
<WSGIRequest
path:/foo,
GET:<QueryDict: {}>, 
POST:<QuestDict: {}>,
...
>
(Epdb) request.session.session_key
'i31kq7lljj3up5v7hbw9cff0rga2vlq5'
(Epdb) list
 85         raise some_error.CustomError()
 86 
 87     # Example login view
 88     def login(request, username, password):
 89         import epdb; epdb.serve()
 90  ->     return my_login_method(username, password)
 91
 92     # Example view to show session key
 93     def get_session_key(request):
 94         return request.session.session_key
 95

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

import epdb; epdb.serve(4242)

>> import epdb; epdb.connect(host='192.168.3.2', port=4242)

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.

Jacinda
fuente
epdb no se actualiza desde 2011. ¿Alguna vez ha tenido problemas al usarlo en versiones más recientes de Django y / o Python?
Seperman
Nunca me he encontrado con problemas al usarlo contra Python 2 (específicamente 2.4-2.7). Lo usé hace solo unos días, de hecho. Nunca he probado con Python 3.
Jacinda
1
Estoy ejecutando django 1.8 en python 2.7 y no puedo obtener epdb.connect para hablar con epdb.serve. Solo tengo un tiempo de espera.
David Watson
6

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.

Conejera
fuente
PyCharm solo usa PyDev, creo, no el suyo.
Rob Grant
6

Agregue import pdb; pdb.set_trace()o breakpoint() (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 ejecutando
  • n pasar a la siguiente línea dentro de la misma función
  • s paso a la siguiente línea en esta función o una función llamada
  • q salir del depurador / ejecución

Ver también: https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28

Chris
fuente
5

Una de sus mejores opciones para depurar el código de Django es a través de wdb: https://github.com/Kozea/wdb

wdb funciona con python 2 (2.6, 2.7), python 3 (3.2, 3.3, 3.4, 3.5) y pypy. ¡Aún mejor, es posible depurar un programa de Python 2 con un servidor wdb que se ejecuta en Python 3 y viceversa o depurar un programa que se ejecuta en una computadora con un servidor de depuración que se ejecuta en otra computadora dentro de una página web en una tercera computadora! Incluso mejor, ahora es posible pausar un proceso / hilo de Python actualmente en ejecución usando la inyección de código desde la interfaz web. (Esto requiere que gdb y ptrace estén habilitados) En otras palabras, es una versión muy mejorada de pdb directamente en su navegador con buenas características.

Instale y ejecute el servidor, y en su código agregue:

import wdb
wdb.set_trace()

Según el autor, las principales diferencias con respecto a pdbson:

Para aquellos que no conocen el proyecto, wdb es un depurador de python como pdb, pero con una interfaz web elegante y muchas características adicionales, como:

  • Fuente resaltado de sintaxis
  • Puntos de corte visuales
  • Terminación de código interactivo usando jedi
  • Puntos de interrupción persistentes
  • Inspección de objetos profundos con el mouse Multithreading / Multiprocessing support
  • Depuración remota
  • Ver expresiones
  • En la edición del código del depurador
  • Integración de servidores web populares para romper en caso de error
  • En excepción, se rompe durante el rastreo (no post-mortem) al contrario del depurador werkzeug, por ejemplo
  • Irrumpir en los programas que se ejecutan actualmente a través de la inyección de código (en sistemas compatibles)

Tiene una excelente interfaz de usuario basada en navegador. Una alegría de usar! :)

fessacchiotto
fuente
¿Cuál es la diferencia con pdb?
Dunatotatos
4

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.

Garmoncheg
fuente
2

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:

{% print var %}   prints variable
{% print %}       prints all

Utiliza un formato pprint personalizado para mostrar las variables en una <pre>etiqueta.

vdboor
fuente
2

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.pycon el depurador adjunto, por lo que puede establecer puntos de interrupción y recorrer su código a su gusto.

Noah MacCallum
fuente
2

Para aquellos que accidentalmente pueden agregar pdb en commits en vivo, puedo sugerir esta extensión de respuesta #Koobz:

@register.filter 
def pdb(element):
    from django.conf import settings
    if settings.DEBUG:    
        import pdb
        pdb.set_trace()
    return element
MontyThreeCard
fuente
2

Desde mi propia experiencia, hay dos maneras:

  1. use ipdb , que es un depurador mejorado que le gusta pdb.

    import ipdb;ipdb.set_trace()o breakpoint() (de python3.7)

  2. use django shell, solo use el comando a continuación. Esto es muy útil cuando está desarrollando una nueva vista.

    python manage.py shell

Mark White
fuente
1

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.

IanH
fuente
1

usar pdbo ipdb. La diferencia entre estos dos es ipdb admite autocompletar.

para pdb

import pdb
pdb.set_trace()

para ipdb

import ipdb
ipdb.set_trace()

Para ejecutar la nueva ntecla de golpe de línea , para continuar la ctecla de golpe . verifique más opciones usandohelp(pdb)

Abdul Gaffar
fuente
0

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.

TypeError at /db/hcm91dmo/catalog/records/

render_option() argument after * must be a sequence, not int

....


Error during template rendering

In template /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/crispy_forms/templates/bootstrap3/field.html, error at line 28
render_option() argument after * must be a sequence, not int
18  
19          {% if field|is_checkboxselectmultiple %}
20              {% include 'bootstrap3/layout/checkboxselectmultiple.html' %}
21          {% endif %}
22  
23          {% if field|is_radioselect %}
24              {% include 'bootstrap3/layout/radioselect.html' %}
25          {% endif %}
26  
27          {% if not field|is_checkboxselectmultiple and not field|is_radioselect %}
28  

      {% if field|is_checkbox and form_show_labels %}

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.

  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py", line 537, in __str__
    return self.as_widget()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py", line 593, in as_widget
    return force_text(widget.render(name, self.value(), attrs=attrs))
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py", line 513, in render
    options = self.render_options(choices, [value])
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py", line 543, in render_options
    output.append(self.render_option(selected_choices, *option))
TypeError: render_option() argument after * must be a sequence, not int
INFO lib.capture_middleware log write_to_index(http://localhost:8082/db/hcm91dmo/catalog/records.html)
INFO lib.capture_middleware log write_to_index:end
> /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py(543)render_options()
-> output.append(self.render_option(selected_choices, *option))
(Pdb) import pprint
(Pdb) pprint.PrettyPrinter(indent=4).pprint(self)
<django.forms.widgets.Select object at 0x115fe7d10>
(Pdb) pprint.PrettyPrinter(indent=4).pprint(vars(self))
{   'attrs': {   'class': 'select form-control'},
    'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]],
    'is_required': False}
(Pdb)         

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.

 'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]]

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.

JL Peyret
fuente
0

Durante el desarrollo, agregando un rápido

assert False, value

puede ayudar a diagnosticar problemas en las vistas o en cualquier otro lugar, sin la necesidad de usar un depurador.

Udi
fuente