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