summaryrefslogtreecommitdiff
path: root/docs/narr/hooks.rst
diff options
context:
space:
mode:
Diffstat (limited to 'docs/narr/hooks.rst')
-rw-r--r--docs/narr/hooks.rst108
1 files changed, 97 insertions, 11 deletions
diff --git a/docs/narr/hooks.rst b/docs/narr/hooks.rst
index b5efc0df1..43bf48289 100644
--- a/docs/narr/hooks.rst
+++ b/docs/narr/hooks.rst
@@ -257,6 +257,95 @@ already constructed a :term:`configurator` it can also be registered via the
config.set_request_factory(MyRequest)
.. index::
+ single: request method
+
+.. _adding_request_method:
+
+Adding Methods or Properties to Request Object
+----------------------------------------------
+
+.. versionadded:: 1.4.
+
+Since each Pyramid application can only have one :term:`request` factory,
+:ref:`changing the request factory <changing_the_request_factory>`
+is not that extensible, especially if you want to build composable features
+(e.g., Pyramid add-ons and plugins).
+
+A lazy property can be registered to the request object via the
+:meth:`pyramid.config.Configurator.add_request_method` API. This allows you
+to specify a callable that will be available on the request object, but will not
+actually execute the function until accessed.
+
+.. warning:: This will silently override methods and properties from
+ :term:`request factory` that have the same name.
+
+.. code-block:: python
+ :linenos:
+
+ from pyramid.config import Configurator
+
+ def total(request, *args):
+ return sum(args)
+
+ def prop(request):
+ print "getting the property"
+ return "the property"
+
+ config = Configurator()
+ config.add_request_method(total)
+ config.add_request_method(prop, reify=True)
+
+In the above example, ``total`` is added as a method. However, ``prop`` is added
+as a property and its result is cached per-request by setting ``reify=True``.
+This way, we eliminate the overhead of running the function multiple times.
+
+ >>> request.total(1, 2, 3)
+ 6
+ >>> request.prop
+ getting the property
+ the property
+ >>> request.prop
+ the property
+
+To not cache the result of ``request.prop``, set ``property=True`` instead of
+``reify=True``.
+
+Here is an example of passing a class to ``Configurator.add_request_method``:
+
+.. code-block:: python
+ :linenos:
+
+ from pyramid.config import Configurator
+ from pyramid.decorator import reify
+
+ class ExtraStuff(object):
+
+ def __init__(self, request):
+ self.request = request
+
+ def total(self, *args):
+ return sum(args)
+
+ # use @property if you don't want to cache the result
+ @reify
+ def prop(self):
+ print "getting the property"
+ return "the property"
+
+ config = Configurator()
+ config.add_request_method(ExtraStuff, 'extra', reify=True)
+
+We attach and cache an object named ``extra`` to the ``request`` object.
+
+ >>> request.extra.total(1, 2, 3)
+ 6
+ >>> request.extra.prop
+ getting the property
+ the property
+ >>> request.extra.prop
+ the property
+
+.. index::
single: before render event
single: adding renderer globals
@@ -336,9 +425,9 @@ when adding renderer global values exists in :ref:`adding_renderer_globals`.
Adding Renderer Globals (Deprecated)
------------------------------------
-.. warning:: this feature is deprecated as of Pyramid 1.1. A non-deprecated
- mechanism which allows event subscribers to add renderer global values
- is documented in :ref:`beforerender_event`.
+.. deprecated:: 1.1
+ An alternative mechanism which allows event subscribers to add renderer
+ global values is documented in :ref:`beforerender_event`.
Whenever :app:`Pyramid` handles a request to perform a rendering (after a
view with a ``renderer=`` configuration attribute is invoked, or when any of
@@ -635,13 +724,13 @@ See :meth:`pyramid.config.add_resource_url_adapter` for more information.
Changing How Pyramid Treats View Responses
------------------------------------------
+.. versionadded:: 1.1
+
It is possible to control how Pyramid treats the result of calling a view
callable on a per-type basis by using a hook involving
:meth:`pyramid.config.Configurator.add_response_adapter` or the
:class:`~pyramid.response.response_adapter` decorator.
-.. note:: This feature is new as of Pyramid 1.1.
-
Pyramid, in various places, adapts the result of calling a view callable to
the :class:`~pyramid.interfaces.IResponse` interface to ensure that the
object returned by the view callable is a "true" response object. The vast
@@ -936,8 +1025,8 @@ For full details, please read the `Venusian documentation
Registering "Tweens"
--------------------
-.. note:: Tweens are a feature which were added in Pyramid 1.2. They are
- not available in any previous version.
+.. versionadded:: 1.2
+ Tweens
A :term:`tween` (a contraction of the word "between") is a bit of code that
sits between the Pyramid router's main request handling function and the
@@ -1241,10 +1330,7 @@ implict and explicit tween chains used by an application. See
Adding A Third Party View, Route, or Subscriber Predicate
---------------------------------------------------------
-.. note::
-
- Third-party view, route, and subscriber predicates are a feature new as of
- Pyramid 1.4.
+.. versionadded:: 1.4
.. _view_and_route_predicates: