是否有可能禁用nginx的自定义错误页面 – 如果我可以称它们 – 显示我的框架的exception页面?
我真的不能看到我的werkzeugdebugging器工具呈现在HTML中…
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; } } }
/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)
PYTHONPATH环境variables:
$ echo $PYTHONPATH /home/my_user/dev/
我如何运行uwsgi:
$ uwsgi -s /tmp/uwsgi.sock --module nginx_test --callable app
我如何运行nginx:
$ nginx -c ~/.virtualenvs/nginx-test/etc/nginx.conf -p ~/.virtualenvs/nginx-test/lib/nginx/
如果我打到根页面:
如果我手动运行nginx:
python /home/my_user/dev/nginx_test/___init___.py
我会看到,而我想看到:
当然,我确定它会工作,当我没有引发exception,但例如在我的index()函数返回“Hello World”。
这被称为.NET中的自定义错误页面。 我想禁用这个,让nginx / uwsgi直接将debugging器生成的html传递给浏览器,而不是内部的服务器错误。
更新2
现在,如果我更改我的烧瓶应用程序启用debugging模式:
/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)
然后我得到502错误。
但是,如果我反而提出exception:
/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)
当我点击页面( http:// localhost:5000 )时,我的浏览器上会显示“Hello World”。
这个“内部服务器错误”页面不是来自nginx,而是来自Flask。 它在调试模式关闭时这样做。
uwsgi将你的代码作为一个模块导入,而不是作为脚本运行。 __name__ == '__main__'
是False,if语句不被执行。 尝试在if之外设置调试模式:
app = Flask(__name__) app.debug = True
但是,强烈建议不要将公用互联网上的服务器的调试模式保留,因为用户可以使服务器运行任何代码。 这是一个严重的安全问题。
使用Flask#errorhandler
在瓶中注册你自己的错误处理程序。 例如,要替换404,你会做类似的事情:
app = Flask() @app.errorhandler(404) def handel_404(error): return render_template('404.html')
Simon Sapin真的给了你正确的答案。 您需要在Flask中启用调试。 Nginx不会返回任何自定义错误页面,除非你明确地配置它。
如果你使用下面的代码,你会看到你的调试消息从瓶子,通过Nginx代理。
from flask import Flask app = Flask(__name__) app.debug = True @app.route('/') def index(): raise Exception()
根据你的更新2.你看到一个502(坏的网关),因为Flask根本就没有返回任何响应,或者Nginx不理解的响应。 502不是Nginx的问题。 这意味着,无论Nginx是否试图说话(在这种情况下,你的烧瓶应用程序)都不能正常工作。
但是,在许多方面,你不应该这样做。 只有在本地开发机器上运行烧瓶时,才能启用调试模式。 无论如何,哪一个是if __name__ == "__main__":
行的整个点。