summaryrefslogtreecommitdiff
path: root/repoze/bfg/urldispatch.py
diff options
context:
space:
mode:
Diffstat (limited to 'repoze/bfg/urldispatch.py')
-rw-r--r--repoze/bfg/urldispatch.py13
1 files changed, 9 insertions, 4 deletions
diff --git a/repoze/bfg/urldispatch.py b/repoze/bfg/urldispatch.py
index 4088cef12..185baa1a1 100644
--- a/repoze/bfg/urldispatch.py
+++ b/repoze/bfg/urldispatch.py
@@ -5,18 +5,20 @@ from zope.interface import directlyProvides
from repoze.bfg.interfaces import IRouteRequest
+from repoze.bfg.compat import all
+from repoze.bfg.encode import url_quote
from repoze.bfg.traversal import traversal_path
from repoze.bfg.traversal import quote_path_segment
-from repoze.bfg.encode import url_quote
_marker = object()
class Route(object):
- def __init__(self, path, name=None, factory=None):
+ def __init__(self, path, name=None, factory=None, predicates=()):
self.path = path
self.match, self.generate = _compile_route(path)
self.name = name
self.factory = factory
+ self.predicates = predicates
class RoutesRootFactory(object):
def __init__(self, default_root_factory):
@@ -30,8 +32,8 @@ class RoutesRootFactory(object):
def get_routes(self):
return self.routelist
- def connect(self, path, name, factory=None):
- route = Route(path, name, factory)
+ def connect(self, path, name, factory=None, predicates=()):
+ route = Route(path, name, factory, predicates)
self.routelist.append(route)
self.routes[name] = route
return route
@@ -69,6 +71,9 @@ class RoutesRootFactory(object):
for route in self.routelist:
match = route.match(path)
if match is not None:
+ preds = route.predicates
+ if preds and not all((p(None, request) for p in preds)):
+ continue
environ['wsgiorg.routing_args'] = ((), match)
environ['bfg.routes.route'] = route
environ['bfg.routes.matchdict'] = match