我一直在使用nginx / gunicorn和Flask为我的应用程序开发一个新的开发平台。
Ops-wise,一切正常 - 我遇到的问题是调试Flask层。当我的代码出现错误时,我只是将500错误返回到浏览器,并且没有任何内容显示在控制台或我的日志中。
我尝试了很多不同的配置/选项......我想我必须缺少明显的东西。
我的gunicorn.conf:
import os
bind = '127.0.0.1:8002'
workers = 3
backlog = 2048
worker_class = "sync"
debug = True
proc_name = 'gunicorn.proc'
pidfile = '/tmp/gunicorn.pid'
logfile = '/var/log/gunicorn/debug.log'
loglevel = 'debug'
borks-testserver.py:
的一些Flask代码示例from flask import Flask
from flask import render_template_string
from werkzeug.contrib.fixers import ProxyFix
app = Flask(__name__)
@app.route('/')
def index():
n = 1/0
return "DIV/0 worked!"
最后,命令在gunicorn中运行烧瓶应用程序:
gunicorn -c gunicorn.conf.py testserver:app
谢谢你们
答案 0 :(得分:72)
接受解决方案对我不起作用。
Gunicorn是一个预分叉环境,显然是the Flask debugger doesn't work in a forking environment。
注意
即使交互式调试器不起作用 分叉环境(几乎不可能使用它 生产服务器)[...]
即使您设置了app.debug = True
,如果您使用gunicorn testserver:app
运行,仍然只会显示带有内部服务器错误消息的空白页面。使用gunicorn可以做的最好的事情是使用gunicorn --debug testserver:app
运行它。除了内部服务器错误消息之外,这还为您提供了跟踪。但是,这与您在终端中看到的文本跟踪相同,而不是Flask调试器。
将if __name__ ...
部分添加到testserver.py并运行python testserver.py
以启动开发中的服务器,可以获得Flask调试器。 换句话说,如果你想要Flask调试器,请不要在开发中使用gunicorn。
app = Flask(__name__)
app.config['DEBUG'] = True
if __name__ == '__main__':
app.run()
就我it sets up all the env variables for me而言,我仍然希望使用foreman start
代替python testserver.py
。为了让这个工作:
Procfile
web: bin/web
bin/web
的内容,文件相对于项目根目录#!/bin/sh
if [ "$FLASK_ENV" == "development" ]; then
python app.py
else
gunicorn app:app -w 3
fi
.env
文件(docs here)FLASK_ENV=development
DEBUG=True
另外,不要忘记将app.config['DEBUG']...
中的testserver.py
行更改为在生产中不会以调试模式运行Flask的内容。
app.config['DEBUG'] = os.environ.get('DEBUG', False)
答案 1 :(得分:44)
Flask配置与gunicorn完全分开。在the Flask documentation on config files之后,一个好的解决方案是改变我的来源:
app = Flask(__name__)
app.config.from_pyfile('config.py')
在config.py中:
DEBUG = True
答案 2 :(得分:23)
对于Heroku用户,有一个比创建像Nick建议的bin / web脚本更简单的解决方案。
如果您想在开发中调试应用程序,请使用foreman start
而不是foreman run python app.py
。
答案 3 :(得分:0)
尝试在运行命令上设置调试标志,如此
gunicorn -c gunicorn.conf.py --debug testserver:app
并将DEBUG = True
保留在Flask应用程序中。必须有一个原因,你的调试选项没有从配置文件中应用,但现在上面的注释应该让你去。
答案 4 :(得分:0)
我在gunicorn下运行烧瓶时遇到类似的问题我没有在浏览器中看到堆栈跟踪(每次都必须查看日志)。设置DEBUG,FLASK_DEBUG或此页面上提到的任何内容都不起作用。最后我这样做了:
app = Flask(__name__)
app.config.from_object(settings_map[environment])
if environment == 'development':
from werkzeug.debug import DebuggedApplication
app_runtime = DebuggedApplication(app, evalex=False)
else:
app_runtime = app
注意evalex已被禁用,因为交互式debbugging不支持分叉(gunicorn)。
答案 5 :(得分:0)
我用了这个:
gunicorn "swagger_server.__main__:app" -w 4 -b 0.0.0.0:8080