Python (Django, Flask, etc.)
Note: This document only applies to student groups with virtual hosts who have applied for apphosting. For normal user accounts or for groups without apphosting, you'll want to host with FastCGI instead. See our instructions for Django or Flask.
You will want to deploy your application using a virtualenv so that you can easily install and manage dependencies and versions.
Setting up a virtualenv
Create a directory for your app to live in:
mkdir -p ~/myapp cd ~/myapp
Set up a virtualenv:
virtualenv venv
Activate the virtualenv:
. venv/bin/activate
You should do this step every time before running your app or managing installed packages.
Copy your code to
~/myapp/src
or similar, and install any dependencies usingpip
.
Installing gunicorn
We recommend using gunicorn to serve your application. After activating your
virtualenv, install it with pip install gunicorn
.
Note that you may see a warning about a syntax error. As long as the output ends in "Successfully installed gunicorn", it's safe to ignore this.
Preparing your app to be supervised
Create a file at ~/myapp/run
with content like:
#!/bin/bash -e
. ~/myapp/venv/bin/activate
PYTHONPATH=~/myapp/src:$PYTHONPATH \
exec gunicorn -w 2 -b unix:/srv/apps/$(whoami)/$(whoami).sock \
--log-file - main:app
Replace main:app
with the module containing the app, and name of your app,
then make run
executable:
chmod +x ~/myapp/run
Test executing the run script. You should be able to access your website while running it (or see any errors in your terminal).
Supervise your app with systemd
Cool, your app works. Set up systemd to supervise your app (so that it starts and restarts automatically).
Bonus Gunicorn tip: reloading your app
Gunicorn will reload your app if you send it SIGHUP. You can teach systemd that
fact by adding the following line under [Service]
in your systemd unit file:
ExecReload=/bin/kill -HUP $MAINPID
and then running systemctl --user daemon-reload
. After that, you can use
systemctl
to reload your app:
systemctl --user reload myapp
Suggestions/improvements?
If you have a better way to host Python-based apps on the app server (or a suggestion for how we could improve this documentation), send us an email!