无法在Flask中启用调试模式

6 投票
1 回答
8619 浏览
提问于 2025-04-18 05:54

我有一个比较简单的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 个回答

6

调试器是 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,都会这样,因为 argparsestore_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 版本的修复已经提交(但还没有发布)。

撰写回答