如何在Flask中调试URL路由?

11

我正在使用Visual Studio 2013的PythonTools开发一个Flask网站,它有自己的调试器,可以让我逐步执行初始设置代码,直到app.run()

但是,我想要调试的代码是路由代码,像这样:

@app.route('/')
def url_index():
     return render_template('index.html') 

我知道函数正在运行,因为服务器会响应index.html,但如果我在最后一行设置断点,它永远不会被触发。

有没有什么方法可以调试这些路由函数? Flask说它带有一个调试器,但我该如何使用它? 它是否与Visual Studio兼容?

4个回答

4

对于Flask调试器,您可以将app.debug设置为True

app.debug = True

或者

app.run(debug=True)

然后:

@app.route('/')
def index():
   raise
   return render_template('index.html') 

然后您可以使用Flask调试器在浏览器中调试该函数。


这给了我Flask调试窗口,让我在该堆栈帧中执行Python代码,但我无法逐步执行代码,并且它也不与Visual Studio调试器交互。 - Migwell
如果你想逐步执行代码,你可以使用 pdbipdb,然后在你想要逐步执行的代码前面加上 import pdb; pdb.set_trace() - atupal
是的,我一直在这样做,但能够与VS调试器交互而不是手动调用pdb仍然很好。 - Migwell
你是否安装了Visual Studio的Python工具? https://pytools.codeplex.com/ Python调试不是内置于VS中的。 - iurisilvio
似乎即使使用PTVS,VS也无法调试Flask项目。 - roim

4

六个月后,虽然在flask中仍然看起来不可能自动调试URL路由,但您可以手动将调试器附加到flask进程,尽管如果您重新启动服务器或自动重新加载程序检测到.py文件更改并重新启动时,您将不得不重新添加它。

只需执行以下操作: 工具->附加到进程 并选择Python.exe,而不是灰色的那个(即visual studio已经在调试的初始flask代码),然后执行一些导致断点命中的操作(例如重新加载页面),你应该会成功。


你能详细说明一下你是如何一开始就得到两个进程的吗?我刚刚尝试了使用附带PTVS 2.1的Flask Web应用程序项目模板,放置在def home内的断点很好地被触发 - 而且这都是在一个进程中完成的。你能将你的启动代码与模板中的runserver.py比较一下吗? - Pavel Minaev
2
啊,我想我找到了一个线索。如果您在调试模式下启动服务器,我认为大多数人都会这样做,运行服务器将生成2个进程,因此不会触发断点。如果您将Debug设置为False(默认值),则仅会生成一个Python进程并且会触发断点。您可以尝试在您的机器上使用调试模式吗? - Migwell
啊,我现在明白了。如果我没记错的话,调试模式启用了代码重新加载功能,这使得对代码所做的任何更改都会自动重新加载到服务器进程中,而这会引起 PTVS 的困扰,因为它不支持自动附加到主进程生成的子进程。你可以在跟踪器中提交一个功能请求。 - Pavel Minaev
我一段时间前将其添加为CodePlex网站上的问题(https://pytools.codeplex.com/workitem/2651)。这就是您所说的功能请求吗? - Migwell
是的,我总是忘记用户不能将它们指定为“特性”或“问题”,只有维护者才能编辑。我看到了那个问题,但现在它基本上是一个狭窄的“这个特定的东西不起作用”的问题。然而,根本原因是缺少一个功能 - 自动附加到生成的子进程 - 而不是一个错误。我将其归档为 https://pytools.codeplex.com/workitem/2668,但你仍然应该投票支持 :) - Pavel Minaev
最新的PTVS 2015似乎仍存在问题。但是这个解决方案仍然有效。 - Ronald

2

1

你可以通过使用调试模式来关闭重新加载功能

app.run(debug=True, use_reloader=False)

Flask错误处理文档详细介绍了调试选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接