Debugging Flask in PyCharm
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).
That is for a project structured like this:
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