Setting up Flask with nginx
I’ve decided to implement one of my next projects in Python. I picked Flask as my HTTP framework for its lightweight and unbinding design. It pretty much allows you to do everything at a low level, should you want to. And I do; I always prefer a low-level approach, without the bulkiness, APIs, configuration files, etc.
In any case, since my webserver of choice has long been nginx (built-in servers don’t impress me too much), having it serve Flask applications in a robust, reliable way was required. The instructions to marry nginx and Flask via uWSGI are quite clear. I compiled the uwsgi application container, read the docs and came up with the following startup command:
sudo uwsgi -s /tmp/uwsgi.application.sock --chdir /path/to/application -w application:app --uid "www-data" --gid "www-data" --touch-reload . --daemonize /var/log/uwsgi.log
The above is a development setting and will probably be very different in production. Since Flask doesn’t force any convention upon you, I picked the following project layout for now:
. |-- application | |-- application.py | |-- models | |-- routes.py | `-- views `-- static |-- favicon.ico |-- js | `-- script.js `-- robots.txt
All Python code is in the This is quite suitable for now. Any recommendations?application
directory, where uwsgi
runs it. Static files are a directory above that, and will be served as from there and not pollute the source tree. I could have kept the static directory under application just as well, but I’ll keep it outside for now. Here’s what I came up for my
Hi,
even this post is a while ago, I would like to ask: Do I have to run the uswgi process all the time or does it work like php where it gets called everytime the site is refreshed/opened in a browser?
If so, can I let it run in a screen session so I can logout?
Carsten, it depends on the configuration; uwsgi can be launched in daemon mode and spawn children, or run in the foreground under a `nohup` or a screen session.
Check out https://uwsgi-docs.readthedocs.org/en/latest/Options.html and other pages of the docs for further information.