Debugging Flask in PyCharm Debugging Flask in PyCharm flask flask

Debugging Flask in PyCharm


A very easy way to check if your application is running under the PyCharm debugger is:

'pydevd' in sys.modules


On Pycharm Professional 2020.1 there is now a Flask Server run/debug configuration choice and I got it working with the following inputs (stops at breakpoints, step in step over, etc).

enter image description here

That is for a project structured like this:

enter image description here

and main.py that looks like this:

import warningsfrom flask import Flaskfrom flask_mongoengine import MongoEnginefrom flask_script import Server, Managerfrom flask_bootstrap import Bootstrapfrom flask_user import UserManagerfrom flask_mail import Mailfrom flask_wtf.csrf import CSRFProtect# for importing module from parent dirimport os, sys, inspectcurrent_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 settingsimport 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.configdef 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