Cómo depurar en Django, el buen camino? [cerrado]


Así que empecé a aprender a codificar en Pythony más tarde Django. Las primeras veces fue difícil mirar tracebacks y realmente averiguar qué hice mal y dónde estaba el error de sintaxis. Algún tiempo ha pasado ahora y algún camino a lo largo del camino, supongo que tengo una rutina en la depuración de mi código Django. Como esto se hizo al principio de mi experiencia de codificación, me senté y me pregunté si cómo estaba haciendo esto era ineficaz y se podía hacer más rápido. Por lo general me las arreglo para encontrar y corregir el errores en mi código, pero me pregunto si debería hacerlo más rápido?

Normalmente solo uso la información de depuración que Django da cuando está habilitada. Cuando las cosas terminan como pensé que lo haría, rompo el flujo de código mucho con un error de sintaxis, y mirar las variables en ese punto en el flujo para averiguar, donde el código hace algo más que lo que quería.

Pero ¿se puede mejorar esto? ¿Hay algunas buenas herramientas o mejores maneras de depurar su código Django?

Author: googletorp, 2009-07-13

27 answers

Hay un montón de maneras de hacerlo, pero la más sencilla es simplemente utilice el depurador de Python . Simplemente agregue la siguiente línea a una función de vista Django:

import pdb; pdb.set_trace()

Si intenta cargar esa página en su navegador, el navegador se colgará y obtendrá un mensaje para continuar depurando el 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 Python codificar. Si ya está en pdb, también querrá echar un vistazo a IPDB que usa ipython para depurar.

Algunas extensiones más útiles para pdb son

Ap++, sugerido por Antash.

Pudb, sugerido por PatDuJour.

Usando el depurador Python en Django, sugerido por Seafangs.

 464
Author: simplyharsh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-06 14:26:35

Me gusta mucho 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 el django-extensions , obtiene un comando de administración runserver_plus que inicia el servidor de desarrollo y le da el depurador de Werkzeug en las 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 de la servidor.

 214
Author: Benjamin Wohlwend,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-02 08:41:20

Un poco rápido para etiquetas de plantilla:

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

Ahora, dentro de una plantilla puedes hacer {{ template_var|pdb }} e ingresar una sesión pdb (dado que estás ejecutando el servidor de desarrollo local) donde puedes inspeccionar element al contenido de tu corazón.

Es una forma muy agradable de ver lo que le ha pasado a tu objeto cuando llega a la plantilla.

 154
Author: Koobz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-24 06:52:09

Hay 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 usando la instalación Python logging. 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 necesitas usar el navegador Firefox con la extensión firebug. Firepython incluye un plugin firebug que mostrará cualquier registro del lado del servidor en una pestaña Firebug.

Firebug en sí también es crítico para depurar el lado Javascript de cualquier aplicación que desarrolle. (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 mucho.

Hay herramientas más útiles como dozer para rastrear las fugas de memoria (también hay otras buenas sugerencias dadas en respuestas aquí en SO para el seguimiento de memoria).

 79
Author: Van Gale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-13 19:38:14

Uso PyCharm (el mismo motor pydev que eclipse). Realmente me ayuda a ser visualmente capaz de pasar a través de mi código y ver lo que está sucediendo.

 50
Author: PhoebeB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-16 02:08:36

Casi todo se ha mencionado hasta ahora, así que solo agregaré que en lugar de pdb.set_trace() se puede usar ipdb.set_trace () que usa IPython y por lo tanto es más potente (autocompletar y otras ventajas). Esto requiere el paquete ipdb, por lo que solo necesita pip install ipdb

 40
Author: Tomasz Zielinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-09 14:35:25

He empujado django-pdb a PyPI. Es una aplicación simple que significa que no necesitas editar tu código fuente cada vez que quieres entrar en pdb.

La instalación es justa...

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

Ahora puede ejecutar: manage.py runserver --pdb para 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 --pdb para entrar en pdb en caso de fallos/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 , contribuciones son bienvenidos, por supuesto.

 31
Author: Tom Christie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-30 00:11:18

La forma más fácil de depurar python - especialmente para programadores que están acostumbrados a Visual Studio - es usando PTVS (Herramientas de Python para Visual Studio). Los pasos son simples:

  1. Descargar e instalar 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ácil como depurar programas C#/C++.
  4. Eso es todo:)

Si desea depurar Django usando PTVS, necesita para hacer lo siguiente:

  1. En la pestaña Configuración del proyecto - General, establezca "Archivo de inicio" en "manage.py", el punto de entrada del programa Django.
  2. En la pestaña Configuración del proyecto - Depuración, establezca "Argumentos de script" en "runserver nor noreload". El punto clave es el" nor noreload " aquí. Si no lo configura, sus puntos de interrupción no se verán afectados.
  3. Disfrútalo.
 19
Author: 029xue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-05 17:26:44

Utilizo PyDev con Eclipse realmente bueno, establecer puntos de interrupción, paso en el código, ver valores en cualquier objeto y variables, probarlo.

 15
Author: gath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-13 08:40:54

Uso PyCharm y me mantengo a su lado durante todo el camino. Me costó un poco, pero tengo que decir que la ventaja que obtengo de ella no tiene precio. Intenté depurar desde la consola y le doy mucho crédito a la gente que puede hacer eso, pero para mí poder depurar visualmente mi(s) aplicación (s) es genial.

Tengo que decir, sin embargo, PyCharm toma mucha memoria. Pero, de nuevo, nada bueno es gratis en la vida. Acaban de llegar con su última versión 3. También juega muy bien con Django, Flask y Google AppEngine. Por lo tanto, en general, yo diría que es una gran herramienta útil para tener para cualquier desarrollador.

Si aún no lo está usando, le recomiendo obtener la versión de prueba durante 30 días para echar un vistazo a la potencia de PyCharm. Estoy seguro de que también hay otras herramientas disponibles, como Aptana. Pero supongo que también me gusta el aspecto de PyCharm. Me siento muy cómodo depurar mis aplicaciones allí.

 10
Author: Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-08 14:18:43

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

  1. Algo ha planteado una excepción: runserver_plus ' Werkzeug depurador al rescate. La capacidad de ejecutar código personalizado en todos los niveles de seguimiento es un asesino. Y si estás completamente atascado, puedes crear un Gist para compartir con solo un clic.
  2. La página se renderiza, pero el resultado es incorrecto: de nuevo, Werkzeug se mece. Para hacer un punto de interrupción en el código, simplemente escriba assert False en el lugar en el que desea detenerse.
  3. El código funciona mal, pero la mirada rápida no ayuda. Probablemente, un problema algorítmico. Suspiro. Entonces suelo encender un depurador de consola PuDB: import pudb; pudb.set_trace(). La principal ventaja sobre [i] pdb es que PuDB (mientras miras como estás 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 interfaz gráfica de usuario.

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 debug toolbar, simplemente inspeccione el contexto en la sección "Plantillas" o, si no es suficiente, establezca un descanso en el código de sus vistas justo después de que se llene el contexto.

Así es.

 9
Author: Alex Morozov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-09 22:17:57

A veces cuando quiero explorar en torno a un método en particular y convocar pdb es demasiado engorroso, yo añadiría:

import IPython; IPython.embed()

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

 8
Author: Lie Ryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-27 00:15:25

Recomiendo encarecidamente epdb (Extended Python Debugger).

Https://bitbucket.org/dugan/epdb

Una cosa que me encanta de epdb para depurar Django u otros servidores web de Python es el epdb.comando serve (). Esto establece una traza y sirve esto en un puerto local al que puede conectarse. Caso de uso típico:

Tengo una visión que quiero ir paso a paso. Voy a insertar lo siguiente en el punto que quiero establecer la traza.

import epdb; epdb.serve()

Una vez que este código obtiene ejecutado, abro un intérprete de Python y me conecto a la instancia que sirve. Puedo analizar todos los valores y pasar por 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 mucho más que puedes aprender sobre escribir la ayuda de epdb en cualquier momento.

Si desea servir o conectarse a varias instancias de epdb al mismo tiempo, puede especificar el puerto en el que desea escuchar (el valor predeterminado es 8080). Es decir,

import epdb; epdb.serve(4242)

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

El host por defecto es 'localhost' si no se especifica. Lo tiré. 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, todavía puedes hacer lo mismo que la respuesta aceptada con epdb (import epdb; epdb.set_trace()), pero quería resaltar la funcionalidad de servir ya que me ha resultado muy útil.

 6
Author: Jacinda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-08 22:26:24

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 silbidos. Autor dice esto sobre wdb -

"Hay IDE como PyCharm que tienen sus propios depuradores. Ofrecen un conjunto similar o igual de características ... Sin embargo, para usarlos, debe usar esos IDE específicos (y algunos de ellos no son libres o pueden no estar disponibles para todos plataforma). Elija la herramienta adecuada para sus necesidades."

Pensé en pasárselo.

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, realice el pago: https://github.com/joerick/pyinstrument . Simplemente agregue pyinstrument.middleware.ProfilerMiddleware a MIDDLEWARE_CLASSES, a continuación, agregar ?perfil a la fin 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.

 6
Author: Hutch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-31 18:43:33

Uso PyCharm y diferentes herramientas de depuración. También tiene un buen conjunto de artículos sobre fácil configurar esas cosas para los principiantes. Puede comenzar aquí. Habla sobre la depuración de PDB y GUI en general con proyectos Django. Espero que alguien se beneficie de ellos.

 3
Author: garmoncheg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-27 19:12:02

Si usa Aptana para el desarrollo de django, observe esto: http://www.youtube.com/watch?v=qQh-UQFltJQ

Si no, considere usarlo.

 2
Author: user1144616,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-06 02:05:13

La mayoría de las opciones ya se mencionan. Para imprimir el contexto de la plantilla, he creado una biblioteca simple para eso. Véase https://github.com/edoburu/django-debugtools

Puede usarlo para imprimir el contexto de la plantilla sin ninguna construcción {% load %}:

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

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

 2
Author: vdboor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-09 14:52:43

Me parece que Visual Studio Code es impresionante para depurar aplicaciones Django. El lanzamiento estándar de Python.los parámetros json se ejecutan python manage.py con el depurador adjunto, para que pueda establecer puntos de interrupción y recorrer el código a su gusto.

 2
Author: Noah MacCallum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-31 03:16:36

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

@register.filter 
def pdb(element):
    from django.conf import settings
    if settings.DEBUG:    
        import pdb
        pdb.set_trace()
    return element
 2
Author: MontyThreeCard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-17 13:55:35

Una de las mejores opciones para depurar código 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 python 2 con un servidor wdb que se ejecuta en python 3 y viceversa o depurar un programa que se ejecuta en un equipo con un servidor de depuración que se ejecuta en otro equipo dentro de una página web en un tercer equipo! Incluso mejor, ahora es posible pausar un actualmente ejecución de procesos/subprocesos de python mediante 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 características agradables.

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 pdb son:

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

  • Resaltado de sintaxis de origen
  • Puntos de interrupción visuales
  • Completar código interactivo usando jedi
  • Puntos de interrupción persistentes
  • Inspección profunda de objetos usando soporte de Multihilo / Multiprocesamiento del ratón
  • Depuración remota
  • Ver expresiones
  • En la edición de código del depurador
  • Integración de servidores web populares para romper en caso de error
  • En excepción ruptura durante el trazo (no post-mortem) en contra del depurador werkzeug, por ejemplo
  • Introducción de programas actualmente en ejecución mediante inyección de código (en sistemas compatibles)

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

 2
Author: fessacchiotto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-16 20:17:46

Agregue import pdb; pdb.set_trace() 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, imprimir variables) o usar comandos como:

  • c continuar la ejecución
  • n paso 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 salga del depurador/ejecución

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

 2
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-01 21:22:08

Recomiendo encarecidamente usar PDB.

import pdb
pdb.set_trace()

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 consultar todo tipo de solicitudes,respuestas y visitas a la base de datos.estoy usando django-debug-toolbar https://github.com/django-debug-toolbar/django-debug-toolbar

 1
Author: nitansh bareja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-12 09:14:05

Como se mencionó en otras publicaciones aquí, establecer puntos de interrupción en su código y caminar a través del código para ver si se comporta como esperaba es una gran manera de aprender algo como Django hasta que tenga una buena idea de cómo se comporta todo y qué está haciendo su código.

Para hacer esto recomendaría usar WingIDE. Al igual que otros IDEs mencionados agradable y fácil de usar, diseño agradable y también fácil de establecer puntos de interrupción evaluar / modificar la pila, etc. Perfecto para visualizar lo que está haciendo tu código a medida que lo atraviesas. Soy un gran fan de ella.

También uso PyCharm - tiene un excelente análisis de código estático y a veces puede ayudar a detectar problemas antes de darse cuenta de que están allí.

Como ya se mencionó django-debug-toolbar is essential - 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 Middleware de impresión SQL disponible en fragmentos de Django en https://djangosnippets.org/snippets/290 /

Esto mostrará las consultas SQL que su vista ha generado. Esto le dará una buena idea de lo que está haciendo el OR y si sus consultas son eficientes o si necesita volver a trabajar su código (o agregar almacenamiento en caché).

Lo encuentro invaluable para mantener un ojo en el rendimiento de la consulta mientras se desarrolla y depura mi aplicación.

Solo otro consejo - lo modifiqué ligeramente para mi propio uso para mostrar solo el resumen y no el Sentencia SQL.... Así que siempre lo uso mientras desarrollo y prueba. También he añadido que si el len (conexión.consultas) es mayor que un umbral predefinido que muestra una advertencia adicional.

Luego, si detecto algo malo (desde una perspectiva de rendimiento o número de consultas) está sucediendo, vuelvo a la visualización completa de las instrucciones SQL para ver exactamente lo que está sucediendo. Muy útil cuando se está trabajando en un gran proyecto de Django con varios desarrolladores.

 1
Author: IanH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-09 12:24:44

Una sugerencia adicional.

Puede aprovechar nosetests y pdb juntos, en lugar de inyectar pdb.set_trace() en sus vistas manualmente. La ventaja es que puede observar las condiciones de error cuando se inician por primera vez, potencialmente en el 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 metí la pata al constructor para el formulario, e incluso tengo una buena idea de qué campo es un problema. Pero, ¿puedo usar pdb para ver qué es crispy forms quejándose de, dentro de una plantilla?

Sí, puedo. Usando la opción pd pdb en nosetests:

tests$ nosetests test_urls_catalog.py --pdb

Tan pronto como golpeo cualquier excepción (incluyendo las manejadas 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 choices para el constructor crispy field era como si fuera 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 está teniendo lugar dentro del código de Crispy, no el mío y no necesitaba insertarlo manualmente.

 0
Author: JL Peyret,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-28 01:01:29

Use pdb o ipdb. Diferencias entre estos dos es ipdb soporta auto completo.

Para el AP

import pdb
pdb.set_trace()

Para ipdb

import ipdb
ipdb.set_trace()

Para ejecutar la tecla nueva línea hit n, para continuar hit c clave. compruebe más opciones usando help(pdb)

 0
Author: Abdul Gaffar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-05 05:45:53

Durante el desarrollo, añadiendo un rápido

assert False, value

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

 0
Author: Udi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-26 09:39:56

Desde mi propia experiencia, hay dos maneras:

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

    import ipdb;ipdb.set_trace()

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

    python manage.py shell

 0
Author: Mark White,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-24 04:45:40