Subdomain-Routing mit Bottle
Verfasst: Freitag 1. Mai 2015, 10:12
Hi, ich habe mich nun eine ganze Weile mit Bottle beschäftigt und eine Möglichkeit gesucht um mit Subdomains zu arbeiten. D.h. ich möchte die gleiche Route (mit verschiedenen Subdomains) an verschiedene Funktionen binden, d.h.
Dazu habe ich mir überlegt den Standard-Router von Bottle zu erweitern: Ich teile dem Router mit welche App über welche Subdomain erreichbar sein soll und er realisiert das beim Seitenaufruf. Das ganze sieht jetzt so aus:
Was haltet ihr von dieser Lösung? Sieht jmd. mögliche Probleme auf mich zukommen? Oder kennt jemand eine elegantere Lösung?
LG Glocke
Code: Alles auswählen
example.com/foo => desktop_foo()
m.example.com/foo => mobile_foo()
Code: Alles auswählen
import bottle
class Router(bottle.Router):
def __init__(self, *args, **kwargs):
super(Router, self).__init__(*args, **kwargs)
self.subdomains = dict()
def match(self, environ):
router = super(Router, self)
domain = environ.get("HTTP_HOST")
if "." in domain:
domain = domain.split(".")[0]
try:
router = self.subdomains[domain].router
except KeyError:
print("No such subdomain: %s" % domain)
pass
return router.match(environ)
class Application(bottle.Bottle):
def __init__(self, *args, **kwargs):
super(Application, self).__init__(*args, **kwargs)
self.router = Router()
def register_subdomain(self, domain):
if domain in self.router.subdomains:
raise KeyError("subdomain '%s' already in use" % domain)
self.router.subdomains[domain] = bottle.Bottle()
return self.router.subdomains[domain]
if __name__ == '__main__':
default = Application()
mobile = default.register_subdomain("m")
@default.route("/foo")
def default_foo():
return "Hello from default version"
@mobile.route("/foo")
def mobile_foo():
return "Hello from mobile version"
bottle.run(default, host="localhost", port=8080, debug=True, reloader=True)
LG Glocke