summaryrefslogtreecommitdiff
path: root/docs/narr
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-01-12 05:12:57 +0000
committerChris McDonough <chrism@agendaless.com>2009-01-12 05:12:57 +0000
commita0b40cc8aa58c557c30840c906fcba3401bb91cf (patch)
tree9c1b94a971f7394f42aed7e16b7ba49248bb7d47 /docs/narr
parentb16527306a1ddd0ed5c0a9db78a8ffa64c42ae2e (diff)
downloadpyramid-a0b40cc8aa58c557c30840c906fcba3401bb91cf.tar.gz
pyramid-a0b40cc8aa58c557c30840c906fcba3401bb91cf.tar.bz2
pyramid-a0b40cc8aa58c557c30840c906fcba3401bb91cf.zip
- An interface specific to the HTTP verb (GET/PUT/POST/DELETE/HEAD) is
attached to each request object on ingress. The HTTP-verb-related interfaces are defined in ``repoze.bfg.interfaces`` and are ``IGETRequest``, ``IPOSTRequest``, ``IPUTRequest``, ``IDELETERequest`` and ``IHEADRequest``. These interfaces can be specified as the ``request_type`` attribute of a bfg view declaration. A view naming a specific HTTP-verb-matching interface will be found only if the view is defined with a request_type that matches the HTTP verb in the incoming request. The more general ``IRequest`` interface can be used as the request_type to catch all requests (and this is indeed the default). All requests implement ``IRequest``. The HTTP-verb-matching idea was pioneered by `repoze.bfg.restrequest <http://pypi.python.org/pypi/repoze.bfg.restrequest/1.0.1>`_ . That package is no longer required, but still functions fine.
Diffstat (limited to 'docs/narr')
-rw-r--r--docs/narr/views.rst43
1 files changed, 41 insertions, 2 deletions
diff --git a/docs/narr/views.rst b/docs/narr/views.rst
index 8cb00767a..3b60d1394 100644
--- a/docs/narr/views.rst
+++ b/docs/narr/views.rst
@@ -264,13 +264,52 @@ View Request Types
You can optionally add a *request_type* attribute to your ``view``
declaration, which indicates what "kind" of request the view should be
-used for. For example:
+used for. If the request type for a request doesn't match the request
+type that a view defines as its ``request_type`` argument, that view
+won't be called.
+
+For example:
.. code-block:: xml
:linenos:
<view
- for=".models.IHello"
+ for=".models.Hello"
+ view=".views.handle_post"
+ name="handle_post"
+ request_type="repoze.bfg.interfaces.IPOSTRequest"
+ />
+
+The above example registers a view for the ``IPOSTRequest`` type, so
+it will only be called if the request is a POST request. Even if all
+the other specifiers match (e.g. the model type is the class
+``.models.Hello``, and the view_name is ``handle_post``), if the
+request verb is not POST, it will not be invoked. This provides a way
+to ensure that views you write are only called via specific HTTP
+verbs.
+
+The least specific request type is ``repoze.bfg.interfaces.IRequest``.
+All requests are guaranteed to implement this request type. It is
+also the default request type for views that omit a ``request_type``
+argument.
+
+:mod:`repoze.bfg` also makes available more specific request types
+matching HTTP verbs. When these are specified as a ``request_type``
+for a view, the view will be called only when the request has an HTTP
+verb (aka HTTP method) matching the request type. See
+:ref:`interfaces_module` for more information about available request
+types.
+
+Custom View Request Types
+-------------------------
+
+You can make use of *custom* view request types. For example:
+
+.. code-block:: xml
+ :linenos:
+
+ <view
+ for=".models.Hello"
view=".views.hello_json"
name="hello.json"
request_type=".interfaces.IJSONRequest"