Subdomain-Routing mit Bottle

Django, Flask, Bottle, WSGI, CGI…
Antworten
glocke
User
Beiträge: 66
Registriert: Mittwoch 23. Februar 2011, 21:18

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.

Code: Alles auswählen

example.com/foo => desktop_foo()
m.example.com/foo => mobile_foo()
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:

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)
Was haltet ihr von dieser Lösung? Sieht jmd. mögliche Probleme auf mich zukommen? Oder kennt jemand eine elegantere Lösung?

LG Glocke
Antworten