Date

I found it surprisingly difficult to find a plain explanation of setting up hug and apache mod_wsgi. So here is how I did it.

Minimal hug API

Writing an API with hug is really easy. You can write a "hello world" in four lines of code:

import hug

@hug.get('/hello')
def hello(name: str) -> str:
    return "Hello " + name

Running this on a devserver is also trivial:

hug -f hello.py

mod_wsgi

Setting up mod_wsgi is not too difficult either. You need to install the module and enable it, which on Ubuntu was as easy as:

sudo apt install libapache2-mod-wsgi-py3

Note the 'py3' part, however. I wasted quite a bit of time before realizing the module uses a specific version of Python. Since hug is Python 3 only (a shame), a Python 3 build is needed.

The actual host configuration looks something like:

<VirtualHost *:80>
    ServerName hello.example.com
    DocumentRoot /var/www/hello/
    WSGIDaemonProcess hello threads=1
    WSGIScriptAlias / /var/www/api/hello.py

    <Directory /var/www/hello>
        WSGIProcessGroup hello
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

(This is on Ubuntu 16.04 with Apache 2.4.18, running it as the Apache user.)

The WSGI script

The WSGI entry point expected by mod_wsgi is named 'application' while hug exposes one under 'hug_wsgi'. There must be some way to change it from the above configuration (how?), but I ended up adding this to hello.py:

application = __hug_wsgi__

If the application was installed as a package it would be cleaner to have some kind of a separate shi like wsgi.py with just a oneliner:

from mypackage import __hug_wsgi__ as application