【问题标题】:Can't enable debug mode in Flask无法在 Flask 中启用调试模式
【发布时间】:2014-05-08 20:48:44
【问题描述】:

我有一个相当基本的 Flask 应用程序,但由于某种原因无法启用调试模式,所以每当我收到错误时,我都会得到一个 500 页面,而不是带有回溯和所有这些的漂亮调试页面。这是我的应用程序/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

【问题讨论】:

    标签: python flask


    【解决方案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 版本引入了a 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 没有这个错误; fix has been committed for version 2.0.4(尚未发布)。

    【讨论】:

    • 感谢您的回复...我正在使用 Flask-Script 和 runserver 命令,因此我认为不需要显式添加调试器中间件。根据文档,我应该能够将其添加到我的配置中。来自 Flask-Script 文档:“不幸的是,Flask 当前(截至 2014 年 5 月)默认将 DEBUG 配置参数设置为 False。在此更改之前,您可以安全地将 DEFAULT=None 添加到您的 Flask 配置中。Flask-Script 的运行服务器将然后打开调试,但其他一切都将其视为已关闭。”
    • @jcaine04:是的,但是您在配置中明确设置了DEBUG = Truerunserver 命令使用 Flask 的内置服务器,并在执行 app.run() 时设置 debug=True
    • @jcaine04:查看 Flask app.run() 源代码,Flask-Script 一切正常,包括设置 debug=True,这强制app.debug 标志设置为设置为True,以及将use_debuggeruse_reloader 显式设置为True。查看您的项目代码manager.py 我看不出这不起作用的明显原因。当然,请确保您拥有最新版本。
    • 好的,我会继续努力的。感谢您查看此内容。
    • @jcaine04 - 只是想加入另一个数据点。我在使用 Flask 和 Flask-Script 时遇到了同样的行为。 You can view my source here.我已经在我的本地机器(ArchLinux)和 DigitalOcean Debian 机器上复制了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2012-11-28
    • 2018-05-14
    • 1970-01-01
    • 2020-06-02
    • 2014-03-05
    • 2014-01-20
    相关资源
    最近更新 更多