diff options
| author | Chris McDonough <chrism@agendaless.com> | 2010-06-30 02:47:16 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2010-06-30 02:47:16 +0000 |
| commit | 44bc118a61e2e9d93a65b8edd5be9118fb478741 (patch) | |
| tree | 2ecc1bf62e7a1cd06ac303228c9f6f7be6d3caa2 /repoze/bfg/urldispatch.py | |
| parent | fc80bdfeff567a16304721d5af3b80a38121a44d (diff) | |
| download | pyramid-44bc118a61e2e9d93a65b8edd5be9118fb478741.tar.gz pyramid-44bc118a61e2e9d93a65b8edd5be9118fb478741.tar.bz2 pyramid-44bc118a61e2e9d93a65b8edd5be9118fb478741.zip | |
- In earlier versions, a custom route predicate associated with a url
dispatch route (each of the predicate functions fed to the
``custom_predicates`` argument of
``repoze.bfg.configuration.Configurator.add_route``) has always
required a 2-positional argument signature, e.g. ``(context,
request)``. Before this release, the ``context`` argument was
always ``None``.
As of this release, the first argument passed to a predicate is now
a dictionary conventionally named ``info`` consisting of ``match``,
``route``, and ``mapper``. ``match`` is a dictionary: it represents
the arguments matched in the URL by the route. ``route`` is an
object representing the route that matched. ``mapper`` is the url
dispatch route mapper object.
This is useful when predicates need access to the route match. For
example::
def any_of(segment_name, *args):
def predicate(info, request):
if info['match'][segment_name] in args:
return True
num_one_two_or_three = any_of('num, 'one', 'two', 'three')
add_route('/:num', custom_predicates=(num_one_two_or_three,))
Diffstat (limited to 'repoze/bfg/urldispatch.py')
| -rw-r--r-- | repoze/bfg/urldispatch.py | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/repoze/bfg/urldispatch.py b/repoze/bfg/urldispatch.py index becde3ea2..458f1a7a5 100644 --- a/repoze/bfg/urldispatch.py +++ b/repoze/bfg/urldispatch.py @@ -51,9 +51,10 @@ class RoutesMapper(object): match = route.match(path) if match is not None: preds = route.predicates - if preds and not all((p(None, request) for p in preds)): + info = {'route':route, 'match':match} + if preds and not all((p(info, request) for p in preds)): continue - return {'route':route, 'match':match} + return info return {'route':None, 'match':None} |
