Flask为什么不给我提供交互式调试器?

Dav*_*ite 4 python apache mod-wsgi werkzeug flask

这是一个简单的Flask应用,出现语法错误(应该是sys.version,而不是sys.version()

from flask import Flask, url_for, request, render_template
import sys

app = Flask(__name__)
app.config.from_object(__name__)

@app.route('/')
def index():
    version = sys.version()
    return "This is the index page.  Python version info: {}".format(version)

if __name__ == '__main__':
    app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

当我在本地运行它并尝试访问http:// localhost:5000时,我得到了不错的Werkzeug调试器:

在此处输入图片说明

但是当我在远程服务器(Apache 2.4.17,mod_wsgi 4.4.21)上运行它时,我只得到一个通用的500错误页面:

在此处输入图片说明

我已经尝试了各种方法来使这项工作:

  • app.debug = True之后app = Flask(__name__)
  • 基于此链接,我也尝试添加以下代码:

from werkzeug.debug import DebuggedApplication application = DebuggedApplication(app, True)

但似乎无济于事。

我知道调试器无法在派生环境中工作,但是根据此链接,mod_wsgi的默认模式是派生。我的Apache配置为:

WSGIDaemonProcess flasktest user=david group=devgrp threads=1 python-path=/apps/www/80/wsgi-scripts/FlaskTest:/apps/.virtualenvs/flasktest/lib/python3.4/site-packages
Run Code Online (Sandbox Code Playgroud)

那为什么不能得到漂亮的调试器呢?

编辑:这是我添加的修改文件(无效)

from flask import Flask
import sys

app = Flask(__name__)
app.config.from_object(__name__)
app.debug = True

from werkzeug.debug import DebuggedApplication
application = DebuggedApplication(app, True)  

@app.route('/')
def index():   
    version = sys.version()
    return "This is the index page.  Python version info: {}".format(version)

if __name__ == '__main__':
    app.run(debug=True)   
Run Code Online (Sandbox Code Playgroud)

dav*_*ism 5

要将WSGI中间件添加到Flask应用程序中,请包装并替换该应用程序的wsgi_app属性。对于调试中间件,app.debug = True也要进行设置,以使Flask不会将异常转换为500个响应。

app.debug = True
app.wsgi_app = DebuggedApplication(app.wsgi_app, evalex=True)
Run Code Online (Sandbox Code Playgroud)

在公共服务器上运行调试器存在安全风险。尽管最近的更改要求在运行代码之前先输入PIN,但调试器可能仍会以无法预见的方式变得不安全。通常,您可以使用日志记录获取有关生产中错误的信息。 这个答案是有关如何进行设置的很好的基本总结。


如果您已替换app而不是调用它,则该方法可能会起作用application。mod_wsgi可能是在app之前使用的application,因此它仍在运行原始应用程序。仍然建议将其包装app.wsgi_app