dynamic app routing for Bottle.py based on hostname / domain

Problem:

I want ONE bottle project to display different pages for:

These should be separate Bottle apps.

There's an ugly hack from the official maillist, I think I can make it better.

The secret is to create a customized WSGI app:

from fnmatch import fnmatch
from bottle import Bottle, default_app, run

foo = Bottle()
foo.hostnames = ['foo.est.im']
@foo.route('/')
def hello():
    return 'hello!'

bar = Bottle()
bar.hostnames = ['bar.est.im']
@bar.route('/')
def hi():
    return 'hi~'

@route('/')
def index():
    print 'hello world'

def application(environ, start_response):
    for app in [foo, bar]:
        hostnames = getattr(app, 'hostnames', [])
        if filter(lambda x:fnmatch(hostname, x), hostnames):
            return app(environ, start_response)
    return default_app()(environ, start_response)

Then run this motherfucker:

from django.utils import autoreload
def dev_server():
    run(application, host='0.0.0.0', port=8002, debug=True)
autoreload.main(dev_server)

Comments