用pdb调试烧瓶

时间:2014-11-08 00:08:43

标签: python debugging flask pdb

我正在尝试使用pdb来调试flask应用程序。 设置断点很容易;我只是在调用index()时使用b index来中断,或者在第44行使用b 44来设置断点。

断点适用于b 44这是主要的开头,但b index不起作用。 在命令行中,打印“Index is called”以指示调用该方法,但它不会在pdb中停止。

@app.route('/', methods=['GET', 'POST'])
def index():
    print "Index is called"
    name = None
    ...
    return render_template('index.html', form=form, name=name)

if __name__ == '__main__':
    manager.run() # line 44

可能有什么问题?

3 个答案:

答案 0 :(得分:19)

您可以在要执行中断的行执行此操作:

import pdb; pdb.set_trace()

请确保在提交前删除它:)。

答案 1 :(得分:2)

  

我试图使用pdb调试烧瓶应用程序。设置断点很容易;我只是在调用index()时使用b index来断开,或者在第44行使用b 44来设置断点。

是的,没关系。

  

断点适用于b 44,它是main的开头,但是b索引不起作用。在命令行中,"索引被调用"打印以指示该方法被调用,但它不会在pdb中停止。

"问题"这是你告诉调试器在名为main()的函数的开头打破,但这不是你认为的函数,你会看到,真正发生的是装饰器正在用一些其他函数(烧瓶的路由处理程序)替换你的main()函数,所以当你执行b index时,你告诉调试器停在main指向的函数的第一行,这是烧瓶的代码。

在此示例中尝试设置b index1

def deco(fn):
    def _wrapper():
        print "Deco called"
        return fn()
    return _wrapper

@deco
def index1():
    print "Index is called"
    return "hi stranger!"

salva = index1

if __name__ == '__main__':
    import pdb; pdb.set_trace()
    index1()

答案 2 :(得分:0)

您可以定义一个http端点,当您在浏览器中将其插入pdb时(例如,在http://127.0.0.1:5000/pdb

@app.route('/pdb')
def pdb():
   """Enter python debugger in terminal"""

   import sys
   print("\n'/pdb' endpoint hit. Dropping you into python debugger. globals:")
   print("%s\n" % dir(sys.modules[__name__]))
   import pdb; pdb.set_trace()

   return 'After PDB debugging session, now execution continues...'

您当然应该根据需要添加适当的安全保护,例如禁止生产,添加身份验证等。