无法在Flask中启用调试模式
我有一个比较简单的Flask应用,但不知道为什么调试模式无法开启。这样一来,每当出现错误时,我看到的就是一个500错误页面,而不是那个漂亮的调试页面,里面有错误追踪信息和其他内容。以下是我的app/init.py文件:
from flask import Flask
from config import config
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
from .api import api as api_blueprint
app.register_blueprint(api_blueprint, url_prefix='/api/v1.0')
return app
这是我的config.py文件:
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config:
SECRET_KEY = '12345'
SQL_DRIVER = 'SQL Server Native Client 11.0'
SQL_SERVER = 'WIN8\MSSQL2K12'
SQL_DATABASE = 'LogMe'
SQL_USER = 'LogMe'
SQL_PASSWORD = 'password'
@staticmethod
def init_app(app):
pass
class DevelopmentConfig(Config):
DEBUG = True
config = {
'development' : DevelopmentConfig
}
我把整个项目都放到了GitHub上,如果其他地方有问题可以去看看,但我觉得问题应该出在这两个文件里: https://github.com/jcaine04/perf-dash/tree/master/app
1 个回答
调试器是 WSGI 运行器 的一部分,也就是 app.run()
服务器。如果你使用其他的 WSGI 服务器,就需要手动添加调试中间件:
def create_app(config_name):
app = Flask(__name__)
# ...
if app.debug:
from werkzeug.debug import DebuggedApplication
app.wsgi_app = DebuggedApplication(app.wsgi_app, True)
return app
当你使用 Flask-Script 时,runserver
会启动 Flask 的 WSGI 开发服务器,并且会启用调试器。
不过,Flask-Script 的 2.0.3 版本出现了一个 bug;它没有正确设置新的调试标志,导致调试器 总是 被禁用,除非你明确传入 -d
标志。无论你是否将 use_debugger
设置为 true,都会这样,因为 argparse
的 store_true
选项默认是存储 False
,如果没有被选中。
解决这个问题的方法是明确使用 -d
,或者 修改 flask_script/commands.py
文件,让所有的 --debug
和 --no-debug
选项默认使用 self.use_debugger
:
if self.use_debugger:
options += (Option('-d', '--debug',
action='store_true',
dest='use_debugger',
help="(no-op for compatibility)",
default=self.use_debugger),)
options += (Option('-D', '--no-debug',
action='store_false',
dest='use_debugger',
default=self.use_debugger),)
else:
options += (Option('-d', '--debug',
action='store_true',
dest='use_debugger',
default=self.use_debugger),)
options += (Option('-D', '--no-debug',
action='store_false',
dest='use_debugger',
help="(no-op for compatibility)",
default=self.use_debugger),)
在这里,我为两个还没有设置默认值的选项添加了 default=self.use_debugger
。
对于 self.use_reloader
的处理也有类似的问题。
版本 0.6.7 和 1.0 没有这个 bug;而 2.0.4 版本的修复已经提交(但还没有发布)。