Python PyCharm中的调试烧瓶

Python PyCharm中的调试烧瓶,python,debugging,flask,pycharm,Python,Debugging,Flask,Pycharm,我试图弄清楚如何在使用Flask(Werkzeug)调试器调试Flask应用程序和使用PyCharm的调试器之间轻松切换。我已经有了两个PyCharm运行配置 我使用“Run”和提供给应用程序脚本的--debug标志调用的一个;及 我使用“Debug”和提供给应用程序脚本的--pydebug标志调用的一个 使用“我的应用程序脚本中支持的标志” 这是可行的,并且满足了我不需要编辑任何代码就可以部署到服务器的要求;但我不确定这是最好的方法。首先,我需要记住,第二个配置是使用“调试”(而不是“运行”)

我试图弄清楚如何在使用Flask(Werkzeug)调试器调试Flask应用程序和使用PyCharm的调试器之间轻松切换。我已经有了两个PyCharm运行配置

  • 我使用“Run”和提供给应用程序脚本的
    --debug
    标志调用的一个;及
  • 我使用“Debug”和提供给应用程序脚本的
    --pydebug
    标志调用的一个
  • 使用“我的应用程序脚本中支持的标志”

    这是可行的,并且满足了我不需要编辑任何代码就可以部署到服务器的要求;但我不确定这是最好的方法。首先,我需要记住,第二个配置是使用“调试”(而不是“运行”)启动的,而第一个配置是使用PyCharm中的“运行”(而不是“调试”)启动的


    是否有更好的方法支持PyCharm中的这两种调试方法,使用PyCharm的某些功能(例如,允许我检测何时调用了“调试”而不是“运行”),或者更智能地使用Flask的功能。

    检查应用程序是否在PyCharm调试器下运行的一种非常简单的方法是:

    'pydevd' in sys.modules
    

    在Pycharm Professional 2020.1上,现在有了一个Flask服务器运行/调试配置选项,我可以使用以下输入(在断点处停止,分步执行,等等)

    这适用于以下结构的项目:

    
    import warnings
    from flask import Flask
    from flask_mongoengine import MongoEngine
    from flask_script import Server, Manager
    from flask_bootstrap import Bootstrap
    from flask_user import UserManager
    from flask_mail import Mail
    from flask_wtf.csrf import CSRFProtect
    
    # for importing module from parent dir
    import os, sys, inspect
    current_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
    parent_dir = os.path.dirname(current_dir)
    sys.path.insert(0, parent_dir)
    import cnf.settings as settings
    import cnf.scripts.scripts as scripts
    
    
    # pymongo has issues...
    warnings.filterwarnings("ignore", category=DeprecationWarning, module='mongoengine')
    
    #instantiate Flask extensions
    #csrf_protect = CSRFProtect()
    #mail = Mail()
    
    config = settings.config
    
    
    def setup_app(config_name, extra_config_settings={} ):
        app = Flask(
            __name__, # special variable that gets string val of __main__ when executing script
            #static_url_path='',
            #static_folder='static',
            static_folder=settings.Config.STATIC_FOLDER,
            template_folder=settings.Config.TEMPLATE_FOLDER,
        )
    
        app.config.from_object(config[config_name])
        # load extra settings from extra config settings param
        app.config.update(extra_config_settings)
    
        with app.app_context():
            app.db = MongoEngine(app)
    
            #csrf_protect.init_app(cnf)
            app.CSRFProtect = CSRFProtect(app)
            #register blueprints
            from cnf.views import register_blueprints
            register_blueprints(app)
    
            # Define bootstrap is hidden_field for flask bootstrap's
            # bootstrap wtf.html
            from wtforms.fields import HiddenField
    
            def is_hidden_field_filter(field):
                return isinstance(field, HiddenField)
    
            app.jinja_env.globals['bootstrap_is_hidden_field'] = is_hidden_field_filter
            app.mail = Mail(app)
            #init_email_error_handler(cnf)
    
            # setup Flask-User to handle user account related forms
            from cnf.models.user_models import User
            user_manager = UserManager(app, app.db, User)
    
            @app.context_processor
            def context_processor():
                return dict(user_manager=user_manager)
    
            app.bootstrap = Bootstrap(app)
            '''
            app.manager = Manager(app)
            app.manager.add_command(
                'runserver',
                Server(
                    host=app.config['FLASK_BIND'],
                    port=app.config['FLASK_PORT']
                )
            )
            '''
            # import csv files
            #app.manager.add_command('import', scripts.Import())
            #Importer = scripts.Import()
            #Importer.run()
    
        return app
    
    '''
    def main():  # pragma: no cover
        app = setup_app('default') #with default dev configs
    
        # Import your views!
        with app.app_context():
            import cnf.views
        app.manager.run()
    
    '''
    
    
    if __name__ == "__main__":  # pragma: no cover
        #add_path()
        app = setup_app('default')
    
        # Import your views!
        with app.app_context():
            pass
        app.run()
        #app.manager.run()
    
    
    # python cnf/main.py runserver
    
    

    和如下所示的
    main.py

    
    import warnings
    from flask import Flask
    from flask_mongoengine import MongoEngine
    from flask_script import Server, Manager
    from flask_bootstrap import Bootstrap
    from flask_user import UserManager
    from flask_mail import Mail
    from flask_wtf.csrf import CSRFProtect
    
    # for importing module from parent dir
    import os, sys, inspect
    current_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
    parent_dir = os.path.dirname(current_dir)
    sys.path.insert(0, parent_dir)
    import cnf.settings as settings
    import cnf.scripts.scripts as scripts
    
    
    # pymongo has issues...
    warnings.filterwarnings("ignore", category=DeprecationWarning, module='mongoengine')
    
    #instantiate Flask extensions
    #csrf_protect = CSRFProtect()
    #mail = Mail()
    
    config = settings.config
    
    
    def setup_app(config_name, extra_config_settings={} ):
        app = Flask(
            __name__, # special variable that gets string val of __main__ when executing script
            #static_url_path='',
            #static_folder='static',
            static_folder=settings.Config.STATIC_FOLDER,
            template_folder=settings.Config.TEMPLATE_FOLDER,
        )
    
        app.config.from_object(config[config_name])
        # load extra settings from extra config settings param
        app.config.update(extra_config_settings)
    
        with app.app_context():
            app.db = MongoEngine(app)
    
            #csrf_protect.init_app(cnf)
            app.CSRFProtect = CSRFProtect(app)
            #register blueprints
            from cnf.views import register_blueprints
            register_blueprints(app)
    
            # Define bootstrap is hidden_field for flask bootstrap's
            # bootstrap wtf.html
            from wtforms.fields import HiddenField
    
            def is_hidden_field_filter(field):
                return isinstance(field, HiddenField)
    
            app.jinja_env.globals['bootstrap_is_hidden_field'] = is_hidden_field_filter
            app.mail = Mail(app)
            #init_email_error_handler(cnf)
    
            # setup Flask-User to handle user account related forms
            from cnf.models.user_models import User
            user_manager = UserManager(app, app.db, User)
    
            @app.context_processor
            def context_processor():
                return dict(user_manager=user_manager)
    
            app.bootstrap = Bootstrap(app)
            '''
            app.manager = Manager(app)
            app.manager.add_command(
                'runserver',
                Server(
                    host=app.config['FLASK_BIND'],
                    port=app.config['FLASK_PORT']
                )
            )
            '''
            # import csv files
            #app.manager.add_command('import', scripts.Import())
            #Importer = scripts.Import()
            #Importer.run()
    
        return app
    
    '''
    def main():  # pragma: no cover
        app = setup_app('default') #with default dev configs
    
        # Import your views!
        with app.app_context():
            import cnf.views
        app.manager.run()
    
    '''
    
    
    if __name__ == "__main__":  # pragma: no cover
        #add_path()
        app = setup_app('default')
    
        # Import your views!
        with app.app_context():
            pass
        app.run()
        #app.manager.run()
    
    
    # python cnf/main.py runserver