为什么没有Flask给我一个交互式调试器?

时间:2016-03-24 19:12:33

标签: python apache flask mod-wsgi werkzeug

这是一个简单的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)

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

enter image description here

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

enter image description here

我已尝试过各种方法来完成这项工作:

  • app.debug = True
  • 之后立即设置app = Flask(__name__)
  • 基于this link,我尝试添加此代码:

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

但似乎没有任何帮助。

我知道调试器在分叉环境中不起作用,但根据this link,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

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

编辑:以下是我添加的修改过的文件(不能正常工作)

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)   

1 个答案:

答案 0 :(得分:4)

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

app.debug = True
app.wsgi_app = DebuggedApplication(app.wsgi_app, evalex=True)

在公共服务器上运行调试器存在安全风险。尽管最近在运行代码之前需要PIN的更改,但调试器仍可能以不可预测的方式不安全。通常,您可以使用日志记录获取有关生产中的错误的信息。 This answer是如何设置它的一个很好的基本摘要。

如果您替换了app而不是将其称为application,那么您的方法可能会有效。 mod_wsgi可能在app之前提升application,因此它仍在运行原始应用。仍然建议包裹app.wsgi_app