将 pycharm 调试器与 Flask 应用程序工厂一起使用

using the pycharm debugger with a flask application factory

我输入的打印语句多于代码。快要死了。

如果通过下面调用 flask 开发服务器,我可以使用 PyCharm 调试器

from ersapp import app

if __name__ == '__main__':
    app.run(debug=True)

我正在按照 Miguel Grinberg's book and an application manager (flask-script) 中的示例使用。我在我的应用程序目录中调用服务器,如下所示

(env)$ python manage.py runserver

并在 appdirectory/__init__.py

def create_app(config_name):
    webapp = Flask(__name__)
    ...
    return webapp

Pycharm 中的调试器会让事情变得更容易,因为那是我工作的地方。

您通过 CLI 手动 运行 项目。要使用 PyCharm IDE 调试,您必须 configure PyCharm for your project 然后 运行 通过 PyCharm.
但是如果你想 运行 没有 PyCharm 的程序,你可以使用 pdb 库来调试目标。试试下面的代码:

import pdb


def my_def():
    try:
        x = 7 / 0
    except Execption as e:
        pdb.set_trace()

当 运行 运行此程序时,您可以在 CLI 上看到交互式行...

我在阅读 Miguel Grinberg 的书时遇到了同样的问题。为了回答如何为您的项目“配置 PyCharm”这个问题,我提供以下评论。

要留在 PyCharm 以利用其卓越的调试器,请转到“编辑配置”,并确保您在该对话框中位于“配置”选项卡上。在那里,顶部的两个文本框是:

Script: set to path of your manage.py

Script parameters: runserver

顺便说一下,我使用的是 PyCharm 4.5.3,尽管我怀疑至少在我使用过的几个以前的版本中以下内容是正确的。现在 运行 来自PyCharm 调用 runserver 命令:

python manage.py runserver 

这会运行 flask 开发服务器,即 app.run()。配置选项卡允许我们指定 运行 特定脚本 manage.py,以及要使用的命令行参数,例如runserver 在这种情况下。在 运行 PyCharm 中的应用程序之后,查看 运行 或 Debug window 中输出的第一行,您将在其他条目中看到:- -file pathto/manage.py runserver.

您可能在脚本参数文本框中指定了 shell 而不是 runserver,在这种情况下您会发现自己在 shell在 运行 PyCharm 中的应用之后。

默认的 Manager(app) 命令是 runservershell。 db 命令被添加到下面的行中的 manage.py:

manager.add_command('db', MigrateCommand) 

在下面添加命令test。注意 @manager.command 装饰器在 def test().

之前

要获取所有 Manager(app) 命令的列表,请在命令行中键入:

python manage.py

如果您在本教程的应用程序工厂部分,您应该看到 {test, shell, db, runserver}。要获得有关任何一个命令类型的帮助:

python manage.py parameter -?

尝试在 "Edit Configurations" 中配置此 python 运行ning 配置。之后,运行 处于调试模式。

如果您正在使用应用程序工厂模式(即使用 creat_app() 而不使用 run.app() main),您可以使用标准的 'flask' 运行 配置模板(社区版本可能没有这些,不确定)。但是,您会注意到调试器不会在断点处停止,因为 DEBUG 运行 中的 flask 应用程序是重新加载器,这意味着它 运行s 在不同的线程中并且 Pycharm 无法捕获它。因此,要使其不仅在午餐时中断,而且要调试任何 API 调用,请确保:

  • select 调试复选框
  • 添加 --no-reload 作为 flask 参数
  • 添加 --without-threads 作为 flask 参数

这是我获得全面调试支持的唯一途径: