Zionetrix::Git
Repositories
Help
Report an Issue
MyCoServer
Code
Commits
Branches
Tags
Search
Tree:
7004713
Branches
Tags
master
MyCoServer
mycoserver
router.py
Initial commit
Benjamin Renard
commited
7004713
at 2014-01-12 00:33:07
router.py
Blame
History
Raw
# -*- coding: utf-8 -*- """Helpers for URLs""" import logging import re from webob.dec import wsgify from . import wsgi_helpers log = logging.getLogger(__name__) def make_router(*routings): """Return a WSGI application that dispatches requests to controllers.""" routes = [] for routing in routings: methods, regex, app = routing[:3] if isinstance(methods, basestring): methods = (methods,) vars = routing[3] if len(routing) >= 4 else {} routes.append((methods, re.compile(regex), app, vars)) @wsgify def router(req): """Dispatch request to controllers.""" split_path_info = req.path_info.split('/') assert not split_path_info[0], split_path_info for methods, regex, app, vars in routes: if methods is None or req.method in methods: match = regex.match(req.path_info) if match is not None: log.debug(u'URL path = {path} matched controller {controller}'.format( controller=app, path=req.path_info)) if getattr(req, 'urlvars', None) is None: req.urlvars = {} req.urlvars.update(dict( (name, value.decode('utf-8') if value is not None else None) for name, value in match.groupdict().iteritems() )) req.urlvars.update(vars) req.script_name += req.path_info[:match.end()] req.path_info = req.path_info[match.end():] return req.get_response(app) return wsgi_helpers.not_found(req.ctx) return router