Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

nginx + uwsgi + flask - disabling custom error pages

Is it possible to disable nginx's custom error pages - if I may call them that - to display my framework's exception pages?

I can't really see my werkzeug debugger tool rendered in html...

UPDATE

OK, I got to make a very very simple flask application to work and I'll post the bits:

/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 environment variable:

$ echo $PYTHONPATH
/home/my_user/dev/

How I run uwsgi:

$ uwsgi -s /tmp/uwsgi.sock --module nginx_test --callable app

How I run nginx:

$ nginx -c ~/.virtualenvs/nginx-test/etc/nginx.conf -p ~/.virtualenvs/nginx-test/lib/nginx/

If I hit the root page:

server error

If I run nginx manually like:

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

I will see instead, and what I want to see:

enter image description here

Of course I made sure it would work when I didn't raise the exception, but returned 'Hello World' for example on my index() function.

This is referred to custom error pages in .NET. I want to disable this and let nginx/uwsgi pass the html generated by the debugger directly to the browser instead of the internal server error thing.

UPDATE 2

Now if I change my flask app to enable debugging mode by:

/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)

Then I get 502 error.

But if I instead of raise 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)

I get 'Hello World' on my browser when I hit the page (http://localhost:5000).

like image 984
johnildergleidisson Avatar asked Jun 21 '12 20:06

johnildergleidisson


2 Answers

This "Internal Server Error" page is not from nginx but from Flask. It does so when debug mode is off.

uwsgi is importing your code as a module, not running at as a script. __name__ == '__main__' is False and the if statement is not executed. Try setting debug mode outside of the if:

app = Flask(__name__)
app.debug = True

However, it is strongly recommended to never leave the debug mode on a server on the public internet, since the user can make the server run any code. This is a serious security issue.

like image 178
Simon Sapin Avatar answered Sep 30 '22 23:09

Simon Sapin


Use Flask#errorhandler to register your own error handlers in flask. For example to replace the 404 you would do something like:

app = Flask()

@app.errorhandler(404)
def handel_404(error):
    return render_template('404.html')
like image 29
Trevor Avatar answered Oct 01 '22 00:10

Trevor