diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-01-12 05:12:57 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-01-12 05:12:57 +0000 |
| commit | a0b40cc8aa58c557c30840c906fcba3401bb91cf (patch) | |
| tree | 9c1b94a971f7394f42aed7e16b7ba49248bb7d47 /docs/narr | |
| parent | b16527306a1ddd0ed5c0a9db78a8ffa64c42ae2e (diff) | |
| download | pyramid-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.rst | 43 |
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" |
