pdb: Using the Python debugger in Django

本文介绍如何利用Python调试器pdb来调试Django应用程序。通过设置断点并逐步执行代码,可以更有效地定位和解决问题。文章提供了具体示例,展示了在Django视图中使用pdb的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A couple conversations I had at DjangoCon last week reminded me that I’d never gotten around to finishing this little post.

Since I started taking my first iOS development baby steps last year, I’ve become quite dependent on breakpoints and stepping as part of my Objective-C debugging workflow.

…And yet, in Python/Django — the stack I spend most of my time working with — I’d stuck to the poor habit of throwing print statements around any found exceptions — for example, to figure out what lies in request.POST for a Django view. And then I came across and started tinkering with pdb.

Here’s a brief overview on how to rock your Python debugging workflow by using an actual interactive debugger. The example below highlights the most basic of usecases, but it’s a good start.

Using pdb with Django

Say, you have a view that looks like this:

     
from django.http import HttpResponse

def default ( request ):
    
     # completely innocuous variables
     foo = 1
     bar = 0
    
     # completely innocuous division
     ni = foo / bar
    
     return HttpResponse ( "Foo says %d " % ni , mimetype = "text/plain" )

And say, you run your local development server with:

manage.py runserver

When accessed, this view will generally throw you something like this:

thumbnail of error example

By replacing the manage.py runserver command with one wrapped in PDB, we can start digging a little bit deeper into this problem view.

python -m pdb manage.py runserver

You will notice that the shell hangs on a (Pdb) prompt. Enter c for “continue” (command reference here) and hit enter. (You’ll also notice that control-c restartsrunserver, since the default PDB behavior is to restart a script after it ends. Just hit control-c a few times to break PDB’s execution loop when you want to kill the server.)

You’ll notice that running under PDB doesn’t do anything by itself.

You’ll need to set a breakpoint to actually tell PDB where to stop execution. Inserting the following line of code causes PDB to break when it executes — which, in turn, triggers the debugging shell.

     
import pdb ; pdb . set_trace ()

In our example, we’d like to inspect where our exception is getting thrown, so we’ll throw it right before the offending line of code:

     
from django.http import HttpResponse

def default ( request ):
    
     # completely innocuous variables
     foo = 1
     bar = 0
    
     # well, this is where our error is, so let's trace it
     import pdb ; pdb . set_trace ()
     ni = foo / bar
    
     return HttpResponse ( "Foo says %d " % ni , mimetype = "text/plain" )

Congrats! Your browser is now waiting for your view to finish, your view is waiting (at the breakpoint) for PDB to finish, and PDB is waiting for you in the shell.

Doing things in PDB

At this point, the PDB shell acts like the normal python/ipython shell. You can look at variables right in the scope of the breakpoint.

thumbnail of debugging example

When working with a breakpoint, you can even screw around with local variables to try and find a fix, but note that only the last line you execute is remembered when you continue. You can still execute several statements by using the semicolon:

thumbnail of debugging example

原文网址链接:https://mike.tig.as/blog/2010/09/14/pdb/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值