用pdb调试烧瓶

问题描述 投票:10回答:3

我正在尝试使用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

可能有什么问题?

python debugging flask pdb
3个回答
18
投票

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

import pdb; pdb.set_trace()

只需确保在提交之前删除它:)。


1
投票

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

是的,没关系。

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

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

尝试在此示例中设置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()

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

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

© www.soinside.com 2019 - 2024. All rights reserved.