nginx + uwsgi + flask - 禁用自定义错误页面

joh*_*son 9 python nginx werkzeug flask uwsgi

是否可以禁用nginx的自定义错误页面 - 如果我可以调用它们 - 来显示我的框架的异常页面?

我无法真正看到我在wtml中呈现的werkzeug调试工具...

UPDATE

好吧,我必须制作一个非常简单的烧瓶应用程序才能工作,我将发布这些内容:

/home/my_user/.virtualenvs/nginx-test/etc/nginx.conf

worker_processes 1;
events { worker_connections 1024; }
http {
        server {
                listen 5000;
                server_name localhost;
                access_log /home/my_user/.virtualenvs/nginx-test/lib/nginx/access.log;
                error_log /home/my_user/.virtualenvs/nginx-test/lib/nginx/error.log;

                location / {
                        include uwsgi_params;
                        uwsgi_pass unix:/tmp/uwsgi.sock;
                }
        }
}
Run Code Online (Sandbox Code Playgroud)

/home/my_user/dev/nginx_test/___init___.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    raise Exception()

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

PYTHONPATH环境变量:

$ echo $PYTHONPATH
/home/my_user/dev/
Run Code Online (Sandbox Code Playgroud)

我如何运行uwsgi:

$ uwsgi -s /tmp/uwsgi.sock --module nginx_test --callable app
Run Code Online (Sandbox Code Playgroud)

我如何运行nginx:

$ nginx -c ~/.virtualenvs/nginx-test/etc/nginx.conf -p ~/.virtualenvs/nginx-test/lib/nginx/
Run Code Online (Sandbox Code Playgroud)

如果我点击根页面:

服务器错误

如果我手动运行nginx,如:

python /home/my_user/dev/nginx_test/___init___.py
Run Code Online (Sandbox Code Playgroud)

相反,我会看到,我想看到的:

在此输入图像描述

当然,我确保它在我没有引发异常时会起作用,但在我的index()函数中返回'Hello World'.

这是指.NET中的自定义错误页面.我想禁用它,让nginx/uwsgi将调试器生成的html直接传递给浏览器,而不是内部服务器错误.

更新2

现在,如果我更改我的烧瓶应用程序以启用调试模式:

/home/my_user/dev/nginx_test/___init___.py

from flask import Flask

app = Flask(__name__)
app.config.update(DEBUG=True)
@app.route('/')
def index():
    raise Exception()

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

然后我得到502错误.

但是,如果我而不是提出异常:

/home/my_user/dev/nginx_test/___init___.py

from flask import Flask

app = Flask(__name__)
app.config.update(DEBUG=True)
@app.route('/')
def index():
    return 'Hello World'

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

当我点击页面时,我的浏览器上出现了"Hello World"(http:// localhost:5000).

Sim*_*pin 6

此"内部服务器错误"页面不是来自nginx,而是来自Flask.当调试模式关闭时,会这样做.

uwsgi将您的代码作为模块导入,而不是作为脚本运行.__name__ == '__main__'为False且不执行if语句.尝试在if之外设置调试模式:

app = Flask(__name__)
app.debug = True
Run Code Online (Sandbox Code Playgroud)

但是,强烈建议永远不要将调试模式保留在公共Internet上的服务器上,因为用户可以使服务器运行任何代码.这是一个严重的安全问题.


Tre*_*vor 1

用于Flask#errorhandler在 Flask 中注册您自己的错误处理程序。例如,要替换 404,您可以执行以下操作:

app = Flask()

@app.errorhandler(404)
def handel_404(error):
    return render_template('404.html')
Run Code Online (Sandbox Code Playgroud)

  • 啊,如果您收到 502 Bad Gateway,那么错误是在您的应用程序有机会启动之前发生的。werkzeug 调试器只能处理请求期间发生的错误。您必须检查 uwsgi 日志中的堆栈跟踪才能解决问题。 (2认同)