Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

document more clearly the __call__ method on route and view predi… #2764

Merged
merged 1 commit into from
Sep 13, 2016
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 22 additions & 7 deletions docs/narr/hooks.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1481,7 +1481,7 @@ method. For example:
phash = text

def __call__(self, context, request):
return getattr(context, 'content_type', None) == self.val
return request.content_type == self.val

The constructor of a predicate factory takes two arguments: ``val`` and
``config``. The ``val`` argument will be the argument passed to
Expand All @@ -1500,13 +1500,28 @@ with the name and the value serialized. The result of ``phash`` is not seen in
output anywhere, it just informs the uniqueness constraints for view
configuration.

The ``__call__`` method of a predicate factory must accept a resource
(``context``) and a request, and must return ``True`` or ``False``. It is the
"meat" of the predicate.
The ``__call__`` method differs depending on whether the predicate is used as
a :term:`view predicate` or a :term:`route predicate`:

You can use the same predicate factory as both a view predicate and as a route
predicate, but you'll need to call ``add_view_predicate`` and
``add_route_predicate`` separately with the same factory.
- When used as a route predicate, the ``__call__`` signature is
``(info, request)``. The ``info`` object is a dictionary containing two
keys: ``match`` and ``route``. ``info['match']`` is the matchdict containing
the patterns matched in the route pattern. ``info['route']`` is the
:class:`pyramid.interfaces.IRoute` object for the current route.

- When used as a view predicate, the ``__call__`` signature is
``(context, request)``. The ``context`` is the result of :term:`traversal`
performed using either the route's :term:`root factory` or the app's
:term:`default root factory`.

In both cases the ``__call__`` method is expected to return ``True`` or
``False``.

It is possible to use the same predicate factory as both a view predicate and
as a route predicate, but they'll need to handle the ``info`` or ``context``
argument specially (many predicates do not need this argument) and you'll need
to call ``add_view_predicate`` and ``add_route_predicate`` separately with
the same factory.

.. _subscriber_predicates:

Expand Down