无法在Flas中启用调试模式

2024-05-15 08:59:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个相当基本的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


Tags: namefrompyimportapiconfigapp应用程序
1条回答
网友
1楼 · 发布于 2024-05-15 08:59:36

调试器是WSGI runner服务器的一部分。如果使用不同的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脚本版本2.0.3引入了a 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没有这个缺陷;afix has been committed for version 2.0.4(还没有发布)。

相关问题 更多 >