summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/api/config.rst2
-rw-r--r--docs/api/httpexceptions.rst2
-rw-r--r--docs/api/interfaces.rst2
-rw-r--r--docs/api/request.rst33
-rw-r--r--docs/api/response.rst1
-rw-r--r--docs/designdefense.rst4
-rw-r--r--docs/glossary.rst26
-rw-r--r--docs/narr/assets.rst2
-rw-r--r--docs/narr/hooks.rst145
-rw-r--r--docs/narr/renderers.rst75
-rw-r--r--docs/narr/router.rst59
-rw-r--r--docs/narr/testing.rst13
-rw-r--r--docs/narr/urldispatch.rst6
-rw-r--r--docs/narr/views.rst236
-rw-r--r--docs/narr/webob.rst105
-rw-r--r--docs/tutorials/wiki/authorization.rst22
-rw-r--r--docs/tutorials/wiki/definingviews.rst10
-rw-r--r--docs/tutorials/wiki/src/authorization/tutorial/login.py2
-rw-r--r--docs/tutorials/wiki2/definingviews.rst3
-rw-r--r--docs/tutorials/wiki2/src/authorization/tutorial/__init__.py2
-rw-r--r--docs/whatsnew-1.1.rst35
21 files changed, 510 insertions, 275 deletions
diff --git a/docs/api/config.rst b/docs/api/config.rst
index 2b9d7bcef..274ee0292 100644
--- a/docs/api/config.rst
+++ b/docs/api/config.rst
@@ -40,6 +40,8 @@
.. automethod:: add_renderer(name, factory)
+ .. automethod:: add_response_adapter
+
.. automethod:: add_route
.. automethod:: add_static_view(name, path, cache_max_age=3600, permission='__no_permission_required__')
diff --git a/docs/api/httpexceptions.rst b/docs/api/httpexceptions.rst
index 57ca8092c..325d5af03 100644
--- a/docs/api/httpexceptions.rst
+++ b/docs/api/httpexceptions.rst
@@ -11,6 +11,8 @@
integer "401" maps to
:class:`pyramid.httpexceptions.HTTPUnauthorized`).
+ .. autofunction:: responsecode
+
.. autoclass:: HTTPException
.. autoclass:: HTTPOk
diff --git a/docs/api/interfaces.rst b/docs/api/interfaces.rst
index ac282fbcc..51a1963b5 100644
--- a/docs/api/interfaces.rst
+++ b/docs/api/interfaces.rst
@@ -57,4 +57,6 @@ Other Interfaces
.. autointerface:: IMultiDict
:members:
+ .. autointerface:: IResponse
+ :members:
diff --git a/docs/api/request.rst b/docs/api/request.rst
index 8cb424658..27ce395ac 100644
--- a/docs/api/request.rst
+++ b/docs/api/request.rst
@@ -107,7 +107,9 @@
return {'text':'Value that will be used by the renderer'}
Mutations to this response object will be preserved in the response sent
- to the client after rendering.
+ to the client after rendering. For more information about using
+ ``request.response`` in conjunction with a renderer, see
+ :ref:`request_response_attr`.
Non-renderer code can also make use of request.response instead of
creating a response "by hand". For example, in view code::
@@ -162,20 +164,21 @@
.. attribute:: response_*
- .. warning:: As of Pyramid 1.1, assignment to ``response_*`` attrs are
- deprecated. Assigning to one will cause a deprecation warning to be
- emitted. Instead of assigning ``response_*`` attributes to the
- request, use API of the the :attr:`pyramid.request.Request.response`
- object (exposed to view code as ``request.response``) to influence
- response behavior.
-
- You can set attributes on a :class:`pyramid.request.Request` which will
- influence the behavor of *rendered* responses (views which use a
- :term:`renderer` and which don't directly return a response). These
- attributes begin with ``response_``, such as ``response_headerlist``. If
- you need to influence response values from a view that uses a renderer
- (such as the status code, a header, the content type, etc) see,
- :ref:`response_prefixed_attrs`.
+ In Pyramid 1.0, you could set attributes on a
+ :class:`pyramid.request.Request` which influenced the behavor of
+ *rendered* responses (views which use a :term:`renderer` and which
+ don't directly return a response). These attributes began with
+ ``response_``, such as ``response_headerlist``. If you needed to
+ influence response values from a view that uses a renderer (such as the
+ status code, a header, the content type, etc) you would set these
+ attributes. See :ref:`response_prefixed_attrs` for further discussion.
+ As of Pyramid 1.1, assignment to ``response_*`` attrs are deprecated.
+ Assigning to one is still supported but will cause a deprecation
+ warning to be emitted, and eventually the feature will be removed. For
+ new code, instead of assigning ``response_*`` attributes to the
+ request, use API of the the :attr:`pyramid.request.Request.response`
+ object (exposed to view code as ``request.response``) to influence
+ rendered response behavior.
.. note::
diff --git a/docs/api/response.rst b/docs/api/response.rst
index c545b4977..e67b15568 100644
--- a/docs/api/response.rst
+++ b/docs/api/response.rst
@@ -8,3 +8,4 @@
.. autoclass:: Response
:members:
:inherited-members:
+
diff --git a/docs/designdefense.rst b/docs/designdefense.rst
index 0321113fa..77711016d 100644
--- a/docs/designdefense.rst
+++ b/docs/designdefense.rst
@@ -428,7 +428,7 @@ allowing people to define "custom" view predicates:
:linenos:
from pyramid.view import view_config
- from webob import Response
+ from pyramid.response import Response
def subpath(context, request):
return request.subpath and request.subpath[0] == 'abc'
@@ -1558,7 +1558,7 @@ comments take into account what we've discussed in the
.. code-block:: python
:linenos:
- from webob import Response # explicit response objects, no TL
+ from pyramid.response import Response # explicit response objects, no TL
from paste.httpserver import serve # explicitly WSGI
def hello_world(request): # accepts a request; no request thread local reqd
diff --git a/docs/glossary.rst b/docs/glossary.rst
index 579d89afd..e45317dae 100644
--- a/docs/glossary.rst
+++ b/docs/glossary.rst
@@ -16,12 +16,12 @@ Glossary
positional argument, returns a ``WebOb`` compatible request.
response
- An object that has three attributes: ``app_iter`` (representing an
- iterable body), ``headerlist`` (representing the http headers sent
- to the user agent), and ``status`` (representing the http status
- string sent to the user agent). This is the interface defined for
- ``WebOb`` response objects. See :ref:`webob_chapter` for
- information about response objects.
+ An object returned by a :term:`view callable` that represents response
+ data returned to the requesting user agent. It must implements the
+ :class:`pyramid.interfaces.IResponse` interface. A response object is
+ typically an instance of the :class:`pyramid.response.Response` class or
+ a subclass such as :class:`pyramid.httpexceptions.HTTPFound`. See
+ :ref:`webob_chapter` for information about response objects.
Repoze
"Repoze" is essentially a "brand" of software developed by `Agendaless
@@ -594,7 +594,7 @@ Glossary
Not Found view
An :term:`exception view` invoked by :app:`Pyramid` when the
- developer explicitly raises a ``pyramid.exceptions.NotFound``
+ developer explicitly raises a ``pyramid.httpexceptions.HTTPNotFound``
exception from within :term:`view` code or :term:`root factory`
code, or when the current request doesn't match any :term:`view
configuration`. :app:`Pyramid` provides a default
@@ -604,7 +604,7 @@ Glossary
Forbidden view
An :term:`exception view` invoked by :app:`Pyramid` when the
developer explicitly raises a
- ``pyramid.exceptions.Forbidden`` exception from within
+ ``pyramid.httpexceptions.HTTPForbidden`` exception from within
:term:`view` code or :term:`root factory` code, or when the
:term:`view configuration` and :term:`authorization policy`
found for a request disallows a particular view invocation.
@@ -618,6 +618,12 @@ Glossary
request processing. See :ref:`exception_views` for more
information.
+ HTTP Exception
+ The set of exception classes defined in :mod:`pyramid.httpexceptions`.
+ These can be used to generate responses with various status codes when
+ raised or returned from a :term:`view callable`. See also
+ :ref:`http_exceptions`.
+
thread local
A thread-local variable is one which is essentially a global variable
in terms of how it is accessed and treated, however, each `thread
@@ -894,5 +900,7 @@ Glossary
http://docs.python.org/distutils/index.html for more information.
:term:`setuptools` is actually an *extension* of the Distutils.
-
+ exception response
+ A :term:`response` that is generated as the result of a raised exception
+ being caught by an :term:`exception view`.
diff --git a/docs/narr/assets.rst b/docs/narr/assets.rst
index 8d0e7058c..0d50b0106 100644
--- a/docs/narr/assets.rst
+++ b/docs/narr/assets.rst
@@ -358,7 +358,7 @@ do so, do things "by hand". First define the view callable.
:linenos:
import os
- from webob import Response
+ from pyramid.response import Response
def favicon_view(request):
here = os.path.dirname(__file__)
diff --git a/docs/narr/hooks.rst b/docs/narr/hooks.rst
index be139ad74..8426f11fd 100644
--- a/docs/narr/hooks.rst
+++ b/docs/narr/hooks.rst
@@ -21,7 +21,7 @@ configuration.
The :term:`not found view` callable is a view callable like any other. The
:term:`view configuration` which causes it to be a "not found" view consists
-only of naming the :exc:`pyramid.exceptions.NotFound` class as the
+only of naming the :exc:`pyramid.httpexceptions.HTTPNotFound` class as the
``context`` of the view configuration.
If your application uses :term:`imperative configuration`, you can replace
@@ -31,9 +31,9 @@ method to register an "exception view":
.. code-block:: python
:linenos:
- from pyramid.exceptions import NotFound
+ from pyramid.httpexceptions import HTTPNotFound
from helloworld.views import notfound_view
- config.add_view(notfound_view, context=NotFound)
+ config.add_view(notfound_view, context=HTTPNotFound)
Replace ``helloworld.views.notfound_view`` with a reference to the
:term:`view callable` you want to use to represent the Not Found view.
@@ -42,8 +42,8 @@ Like any other view, the notfound view must accept at least a ``request``
parameter, or both ``context`` and ``request``. The ``request`` is the
current :term:`request` representing the denied action. The ``context`` (if
used in the call signature) will be the instance of the
-:exc:`~pyramid.exceptions.NotFound` exception that caused the view to be
-called.
+:exc:`~pyramid.httpexceptions.HTTPNotFound` exception that caused the view to
+be called.
Here's some sample code that implements a minimal NotFound view callable:
@@ -56,19 +56,20 @@ Here's some sample code that implements a minimal NotFound view callable:
return HTTPNotFound()
.. note:: When a NotFound view callable is invoked, it is passed a
- :term:`request`. The ``exception`` attribute of the request will
- be an instance of the :exc:`~pyramid.exceptions.NotFound`
- exception that caused the not found view to be called. The value
- of ``request.exception.args[0]`` will be a value explaining why the
- not found error was raised. This message will be different when
- the ``debug_notfound`` environment setting is true than it is when
- it is false.
+ :term:`request`. The ``exception`` attribute of the request will be an
+ instance of the :exc:`~pyramid.httpexceptions.HTTPNotFound` exception that
+ caused the not found view to be called. The value of
+ ``request.exception.args[0]`` will be a value explaining why the not found
+ error was raised. This message will be different when the
+ ``debug_notfound`` environment setting is true than it is when it is
+ false.
.. warning:: When a NotFound view callable accepts an argument list as
described in :ref:`request_and_context_view_definitions`, the ``context``
passed as the first argument to the view callable will be the
- :exc:`~pyramid.exceptions.NotFound` exception instance. If available, the
- resource context will still be available as ``request.context``.
+ :exc:`~pyramid.httpexceptions.HTTPNotFound` exception instance. If
+ available, the resource context will still be available as
+ ``request.context``.
.. index::
single: forbidden view
@@ -85,7 +86,7 @@ the view which generates it can be overridden as necessary.
The :term:`forbidden view` callable is a view callable like any other. The
:term:`view configuration` which causes it to be a "forbidden" view consists
-only of naming the :exc:`pyramid.exceptions.Forbidden` class as the
+only of naming the :exc:`pyramid.httpexceptions.HTTPForbidden` class as the
``context`` of the view configuration.
You can replace the forbidden view by using the
@@ -96,8 +97,8 @@ view":
:linenos:
from helloworld.views import forbidden_view
- from pyramid.exceptions import Forbidden
- config.add_view(forbidden_view, context=Forbidden)
+ from pyramid.httpexceptions import HTTPForbidden
+ config.add_view(forbidden_view, context=HTTPForbidden)
Replace ``helloworld.views.forbidden_view`` with a reference to the Python
:term:`view callable` you want to use to represent the Forbidden view.
@@ -121,13 +122,13 @@ Here's some sample code that implements a minimal forbidden view:
return Response('forbidden')
.. note:: When a forbidden view callable is invoked, it is passed a
- :term:`request`. The ``exception`` attribute of the request will
- be an instance of the :exc:`~pyramid.exceptions.Forbidden`
- exception that caused the forbidden view to be called. The value
- of ``request.exception.args[0]`` will be a value explaining why the
- forbidden was raised. This message will be different when the
- ``debug_authorization`` environment setting is true than it is when
- it is false.
+ :term:`request`. The ``exception`` attribute of the request will be an
+ instance of the :exc:`~pyramid.httpexceptions.HTTPForbidden` exception
+ that caused the forbidden view to be called. The value of
+ ``request.exception.args[0]`` will be a value explaining why the forbidden
+ was raised. This message will be different when the
+ ``debug_authorization`` environment setting is true than it is when it is
+ false.
.. index::
single: request factory
@@ -522,6 +523,100 @@ The default context URL generator is available for perusal as the class
:term:`Pylons` GitHub Pyramid repository.
.. index::
+ single: IResponse
+
+.. _using_iresponse:
+
+Changing How Pyramid Treats View Responses
+------------------------------------------
+
+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
+:method:`pyramid.config.Configurator.add_response_adapter`.
+
+.. 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
+majority of time, the result of this adaptation is the result object itself,
+as view callables written by "civilians" who read the narrative documentation
+contained in this manual will always return something that implements the
+:class:`~pyramid.interfaces.IResponse` interface. Most typically, this will
+be an instance of the :class:`pyramid.response.Response` class or a subclass.
+If a civilian returns a non-Response object from a view callable that isn't
+configured to use a :term:`renderer`, he will typically expect the router to
+raise an error. However, you can hook Pyramid in such a way that users can
+return arbitrary values from a view callable by providing an adapter which
+converts the arbitrary return value into something that implements
+:class:`~pyramid.interfaces.IResponse`.
+
+For example, if you'd like to allow view callables to return bare string
+objects (without requiring a a :term:`renderer` to convert a string to a
+response object), you can register an adapter which converts the string to a
+Response:
+
+.. code-block:: python
+ :linenos:
+
+ from pyramid.response import Response
+
+ def string_response_adapter(s):
+ response = Response(s)
+ return response
+
+ # config is an instance of pyramid.config.Configurator
+
+ config.add_response_adapter(string_response_adapter, str)
+
+Likewise, if you want to be able to return a simplified kind of response
+object from view callables, you can use the IResponse hook to register an
+adapter to the more complex IResponse interface:
+
+.. code-block:: python
+ :linenos:
+
+ from pyramid.response import Response
+
+ class SimpleResponse(object):
+ def __init__(self, body):
+ self.body = body
+
+ def simple_response_adapter(simple_response):
+ response = Response(simple_response.body)
+ return response
+
+ # config is an instance of pyramid.config.Configurator
+
+ config.add_response_adapter(simple_response_adapter, SimpleResponse)
+
+If you want to implement your own Response object instead of using the
+:class:`pyramid.response.Response` object in any capacity at all, you'll have
+to make sure the object implements every attribute and method outlined in
+:class:`pyramid.interfaces.IResponse` and you'll have to ensure that it's
+marked up with ``zope.interface.implements(IResponse)``:
+
+ from pyramid.interfaces import IResponse
+ from zope.interface import implements
+
+ class MyResponse(object):
+ implements(IResponse)
+ # ... an implementation of every method and attribute
+ # documented in IResponse should follow ...
+
+When an alternate response object implementation is returned by a view
+callable, if that object asserts that it implements
+:class:`~pyramid.interfaces.IResponse` (via
+``zope.interface.implements(IResponse)``) , an adapter needn't be registered
+for the object; Pyramid will use it directly.
+
+An IResponse adapter for ``webob.Response`` (as opposed to
+:class:`pyramid.response.Response`) is registered by Pyramid by default at
+startup time, as by their nature, instances of this class (and instances of
+subclasses of the class) will natively provide IResponse. The adapter
+registered for ``webob.Response`` simply returns the response object.
+
+.. index::
single: view mapper
.. _using_a_view_mapper:
@@ -590,7 +685,7 @@ A user might make use of these framework components like so:
# user application
- from webob import Response
+ from pyramid.response import Response
from pyramid.config import Configurator
import pyramid_handlers
from paste.httpserver import serve
diff --git a/docs/narr/renderers.rst b/docs/narr/renderers.rst
index b284fe73f..18cc8e539 100644
--- a/docs/narr/renderers.rst
+++ b/docs/narr/renderers.rst
@@ -72,30 +72,56 @@ When this configuration is added to an application, the
which renders view return values to a :term:`JSON` response serialization.
Other built-in renderers include renderers which use the :term:`Chameleon`
-templating language to render a dictionary to a response.
+templating language to render a dictionary to a response. Additional
+renderers can be added by developers to the system as necessary (see
+:ref:`adding_and_overriding_renderers`).
+
+Views which use a renderer and return a non-Response value can vary non-body
+response attributes (such as headers and the HTTP status code) by attaching a
+property to the ``request.response`` attribute See
+:ref:`request_response_attr`.
If the :term:`view callable` associated with a :term:`view configuration`
-returns a Response object directly (an object with the attributes ``status``,
-``headerlist`` and ``app_iter``), any renderer associated with the view
+returns a Response object directly, any renderer associated with the view
configuration is ignored, and the response is passed back to :app:`Pyramid`
unchanged. For example, if your view callable returns an instance of the
-:class:`pyramid.httpexceptions.HTTPFound` class as a response, no renderer
+:class:`pyramid.response.Response` class as a response, no renderer
will be employed.
.. code-block:: python
:linenos:
- from pyramid.httpexceptions import HTTPFound
+ from pyramid.response import Response
+ from pyramid.view import view_config
+
+ @view_config(renderer='json')
+ def view(request):
+ return Response('OK') # json renderer avoided
+
+Likewise for an :term:`HTTP exception` response:
+
+.. code-block:: python
+ :linenos:
+
+ from pyramid.httpexceptions import HTTPNotFound
+ from pyramid.view import view_config
+ @view_config(renderer='json')
def view(request):
- return HTTPFound(location='http://example.com') # any renderer avoided
+ return HTTPFound(location='http://example.com') # json renderer avoided
-Views which use a renderer can vary non-body response attributes (such as
-headers and the HTTP status code) by attaching a property to the
-``request.response`` attribute See :ref:`request_response_attr`.
+You can of course also return the ``request.response`` attribute instead to
+avoid rendering:
-Additional renderers can be added by developers to the system as necessary
-(see :ref:`adding_and_overriding_renderers`).
+.. code-block:: python
+ :linenos:
+
+ from pyramid.view import view_config
+
+ @view_config(renderer='json')
+ def view(request):
+ request.response.body = 'OK'
+ return request.response # json renderer avoided
.. index::
single: renderers (built-in)
@@ -363,9 +389,34 @@ callable that uses a renderer, assign the ``status`` attribute to the
request.response.status = '404 Not Found'
return {'URL':request.URL}
+Note that mutations of ``request.response`` in views which return a Response
+object directly will have no effect unless the response object returned *is*
+``request.response``. For example, the following example calls
+``request.response.set_cookie``, but this call will have no effect, because a
+different Response object is returned.
+
+.. code-block:: python
+ :linenos:
+
+ from pyramid.response import Response
+
+ def view(request):
+ request.response.set_cookie('abc', '123') # this has no effect
+ return Response('OK') # because we're returning a different response
+
+If you mutate ``request.response`` and you'd like the mutations to have an
+effect, you must return ``request.response``:
+
+.. code-block:: python
+ :linenos:
+
+ def view(request):
+ request.response.set_cookie('abc', '123')
+ return request.response
+
For more information on attributes of the request, see the API documentation
in :ref:`request_module`. For more information on the API of
-``request.response``, see :class:`pyramid.response.Response`.
+``request.response``, see :attr:`pyramid.request.Request.response`.
.. _response_prefixed_attrs:
diff --git a/docs/narr/router.rst b/docs/narr/router.rst
index 11f84d4ea..0812f7ec7 100644
--- a/docs/narr/router.rst
+++ b/docs/narr/router.rst
@@ -77,40 +77,37 @@ processing?
#. A :class:`~pyramid.events.ContextFound` :term:`event` is
sent to any subscribers.
-#. :app:`Pyramid` looks up a :term:`view` callable using the
- context, the request, and the view name. If a view callable
- doesn't exist for this combination of objects (based on the type of
- the context, the type of the request, and the value of the view
- name, and any :term:`predicate` attributes applied to the view
- configuration), :app:`Pyramid` raises a
- :class:`~pyramid.exceptions.NotFound` exception, which is meant
- to be caught by a surrounding exception handler.
+#. :app:`Pyramid` looks up a :term:`view` callable using the context, the
+ request, and the view name. If a view callable doesn't exist for this
+ combination of objects (based on the type of the context, the type of the
+ request, and the value of the view name, and any :term:`predicate`
+ attributes applied to the view configuration), :app:`Pyramid` raises a
+ :class:`~pyramid.httpexceptions.HTTPNotFound` exception, which is meant to
+ be caught by a surrounding :term:`exception view`.
#. If a view callable was found, :app:`Pyramid` attempts to call
the view function.
-#. If an :term:`authorization policy` is in use, and the view was
- protected by a :term:`permission`, :app:`Pyramid` passes the
- context, the request, and the view_name to a function which
- determines whether the view being asked for can be executed by the
- requesting user, based on credential information in the request and
- security information attached to the context. If it returns
- ``True``, :app:`Pyramid` calls the view callable to obtain a
- response. If it returns ``False``, it raises a
- :class:`~pyramid.exceptions.Forbidden` exception, which is meant
- to be called by a surrounding exception handler.
+#. If an :term:`authorization policy` is in use, and the view was protected
+ by a :term:`permission`, :app:`Pyramid` passes the context, the request,
+ and the view_name to a function which determines whether the view being
+ asked for can be executed by the requesting user, based on credential
+ information in the request and security information attached to the
+ context. If it returns ``True``, :app:`Pyramid` calls the view callable
+ to obtain a response. If it returns ``False``, it raises a
+ :class:`~pyramid.httpexceptions.HTTPForbidden` exception, which is meant
+ to be called by a surrounding :term:`exception view`.
#. If any exception was raised within a :term:`root factory`, by
- :term:`traversal`, by a :term:`view callable` or by
- :app:`Pyramid` itself (such as when it raises
- :class:`~pyramid.exceptions.NotFound` or
- :class:`~pyramid.exceptions.Forbidden`), the router catches the
- exception, and attaches it to the request as the ``exception``
- attribute. It then attempts to find a :term:`exception view` for
- the exception that was caught. If it finds an exception view
- callable, that callable is called, and is presumed to generate a
- response. If an :term:`exception view` that matches the exception
- cannot be found, the exception is reraised.
+ :term:`traversal`, by a :term:`view callable` or by :app:`Pyramid` itself
+ (such as when it raises :class:`~pyramid.httpexceptions.HTTPNotFound` or
+ :class:`~pyramid.httpexceptions.HTTPForbidden`), the router catches the
+ exception, and attaches it to the request as the ``exception`` attribute.
+ It then attempts to find a :term:`exception view` for the exception that
+ was caught. If it finds an exception view callable, that callable is
+ called, and is presumed to generate a response. If an :term:`exception
+ view` that matches the exception cannot be found, the exception is
+ reraised.
#. The following steps occur only when a :term:`response` could be
successfully generated by a normal :term:`view callable` or an
@@ -118,9 +115,9 @@ processing?
any :term:`response callback` functions attached via
:meth:`~pyramid.request.Request.add_response_callback`. A
:class:`~pyramid.events.NewResponse` :term:`event` is then sent to any
- subscribers. The response object's ``app_iter``, ``status``, and
- ``headerlist`` attributes are then used to generate a WSGI response. The
- response is sent back to the upstream WSGI server.
+ subscribers. The response object's ``__call__`` method is then used to
+ generate a WSGI response. The response is sent back to the upstream WSGI
+ server.
#. :app:`Pyramid` will attempt to execute any :term:`finished
callback` functions attached via
diff --git a/docs/narr/testing.rst b/docs/narr/testing.rst
index bd45388c2..05e851fde 100644
--- a/docs/narr/testing.rst
+++ b/docs/narr/testing.rst
@@ -191,11 +191,11 @@ function.
:linenos:
from pyramid.security import has_permission
- from pyramid.exceptions import Forbidden
+ from pyramid.httpexceptions import HTTPForbidden
def view_fn(request):
if not has_permission('edit', request.context, request):
- raise Forbidden
+ raise HTTPForbidden
return {'greeting':'hello'}
Without doing anything special during a unit test, the call to
@@ -207,7 +207,7 @@ application registry is not created and populated (e.g. by initializing the
configurator with an authorization policy), like when you invoke application
code via a unit test, :app:`Pyramid` API functions will tend to either fail
or return default results. So how do you test the branch of the code in this
-view function that raises :exc:`Forbidden`?
+view function that raises :exc:`HTTPForbidden`?
The testing API provided by :app:`Pyramid` allows you to simulate various
application registry registrations for use under a unit testing framework
@@ -230,16 +230,15 @@ without needing to invoke the actual application configuration implied by its
testing.tearDown()
def test_view_fn_forbidden(self):
- from pyramid.exceptions import Forbidden
+ from pyramid.httpexceptions import HTTPForbidden
from my.package import view_fn
self.config.testing_securitypolicy(userid='hank',
permissive=False)
request = testing.DummyRequest()
request.context = testing.DummyResource()
- self.assertRaises(Forbidden, view_fn, request)
+ self.assertRaises(HTTPForbidden, view_fn, request)
def test_view_fn_allowed(self):
- from pyramid.exceptions import Forbidden
from my.package import view_fn
self.config.testing_securitypolicy(userid='hank',
permissive=True)
@@ -265,7 +264,7 @@ We call the function being tested with the manufactured request. When the
function is called, :func:`pyramid.security.has_permission` will call the
"dummy" authentication policy we've registered through
:meth:`~pyramid.config.Configuration.testing_securitypolicy`, which denies
-access. We check that the view function raises a :exc:`Forbidden` error.
+access. We check that the view function raises a :exc:`HTTPForbidden` error.
The second test method, named ``test_view_fn_allowed`` tests the alternate
case, where the authentication policy allows access. Notice that we pass
diff --git a/docs/narr/urldispatch.rst b/docs/narr/urldispatch.rst
index 5df1eb3af..f94ed3ba8 100644
--- a/docs/narr/urldispatch.rst
+++ b/docs/narr/urldispatch.rst
@@ -917,7 +917,7 @@ the application's startup configuration, adding the following stanza:
:linenos:
config.add_view('pyramid.view.append_slash_notfound_view',
- context='pyramid.exceptions.NotFound')
+ context='pyramid.httpexceptions.HTTPNotFound')
See :ref:`view_module` and :ref:`changing_the_notfound_view` for more
information about the slash-appending not found view and for a more general
@@ -945,14 +945,14 @@ view as the first argument to its constructor. For instance:
.. code-block:: python
:linenos:
- from pyramid.exceptions import NotFound
+ from pyramid.httpexceptions import HTTPNotFound
from pyramid.view import AppendSlashNotFoundViewFactory
def notfound_view(context, request):
return HTTPNotFound('It aint there, stop trying!')
custom_append_slash = AppendSlashNotFoundViewFactory(notfound_view)
- config.add_view(custom_append_slash, context=NotFound)
+ config.add_view(custom_append_slash, context=HTTPNotFound)
The ``notfound_view`` supplied must adhere to the two-argument view callable
calling convention of ``(context, request)`` (``context`` will be the
diff --git a/docs/narr/views.rst b/docs/narr/views.rst
index 5c9bd91af..e3d0a37e5 100644
--- a/docs/narr/views.rst
+++ b/docs/narr/views.rst
@@ -51,14 +51,14 @@ the request object contains everything your application needs to know
about the specific HTTP request being made.
A view callable's ultimate responsibility is to create a :mod:`Pyramid`
-:term:`Response` object. This can be done by creating the response
-object in the view callable code and returning it directly, as we will
-be doing in this chapter. However, if a view callable does not return a
-response itself, it can be configured to use a :term:`renderer` that
-converts its return value into a :term:`Response` object. Using
-renderers is the common way that templates are used with view callables
-to generate markup. See the :ref:`renderers_chapter` chapter for
-details.
+:term:`Response` object. This can be done by creating the response object in
+the view callable code and returning it directly, as we will be doing in this
+chapter. However, if a view callable does not return a response itself, it
+can be configured to use a :term:`renderer` that converts its return value
+into a :term:`Response` object. Using renderers is the common way that
+templates are used with view callables to generate markup: see the
+:ref:`renderers_chapter` chapter for details. In some cases, a response may
+also be generated by raising an exception within a view callable.
.. index::
single: view calling convention
@@ -230,112 +230,130 @@ implements the :term:`Response` interface is to return a
def view(request):
return Response('OK')
-You don't need to always use :class:`~pyramid.response.Response` to represent
-a response. :app:`Pyramid` provides a range of different "exception" classes
-which can act as response objects too. For example, an instance of the class
-:class:`pyramid.httpexceptions.HTTPFound` is also a valid response object
-(see :ref:`http_redirect`). A view can actually return any object that has
-the following attributes.
+:app:`Pyramid` provides a range of different "exception" classes which
+inherit from :class:`pyramid.response.Response`. For example, an instance of
+the class :class:`pyramid.httpexceptions.HTTPFound` is also a valid response
+object because it inherits from :class:`~pyramid.response.Response`. For
+examples, see :ref:`http_exceptions` and ref:`http_redirect`.
-status
- The HTTP status code (including the name) for the response as a string.
- E.g. ``200 OK`` or ``401 Unauthorized``.
+You can also return objects from view callables that aren't instances of (or
+instances of classes which are subclasses of)
+:class:`pyramid.response.Response` in various circumstances. This can be
+helpful when writing tests and when attempting to share code between view
+callables. See :ref:`renderers_chapter` for the common way to allow for
+this. A much less common way to allow for view callables to return
+non-Response objects is documented in :ref:`using_iresponse`.
-headerlist
- A sequence of tuples representing the list of headers that should be
- set in the response. E.g. ``[('Content-Type', 'text/html'),
- ('Content-Length', '412')]``
+.. index::
+ single: view exceptions
-app_iter
- An iterable representing the body of the response. This can be a
- list, e.g. ``['<html><head></head><body>Hello
- world!</body></html>']`` or it can be a file-like object, or any
- other sort of iterable.
+.. _special_exceptions_in_callables:
+
+Using Special Exceptions In View Callables
+------------------------------------------
+
+Usually when a Python exception is raised within a view callable,
+:app:`Pyramid` allows the exception to propagate all the way out to the
+:term:`WSGI` server which invoked the application. It is usually caught and
+logged there.
-These attributes form the structure of the "Pyramid Response interface".
+However, for convenience, a special set of exceptions exists. When one of
+these exceptions is raised within a view callable, it will always cause
+:app:`Pyramid` to generate a response. These are known as :term:`HTTP
+exception` objects.
.. index::
- single: view http redirect
- single: http redirect (from a view)
+ single: HTTP exceptions
-.. _http_redirect:
+.. _http_exceptions:
-Using a View Callable to Do an HTTP Redirect
---------------------------------------------
+HTTP Exceptions
+~~~~~~~~~~~~~~~
+
+All classes documented in the :mod:`pyramid.httpexceptions` module documented
+as inheriting from the :class:`pryamid.httpexceptions.HTTPException` are
+:term:`http exception` objects. An instances of an HTTP exception object may
+either be *returned* or *raised* from within view code. In either case
+(return or raise) the instance will be used as as the view's response.
-You can issue an HTTP redirect from within a view by returning a particular
-kind of response.
+For example, the :class:`pyramid.httpexceptions.HTTPUnauthorized` exception
+can be raised. This will cause a response to be generated with a ``401
+Unauthorized`` status:
.. code-block:: python
:linenos:
- from pyramid.httpexceptions import HTTPFound
+ from pyramid.httpexceptions import HTTPUnauthorized
- def myview(request):
- return HTTPFound(location='http://example.com')
+ def aview(request):
+ raise HTTPUnauthorized()
-All exception types from the :mod:`pyramid.httpexceptions` module implement
-the :term:`Response` interface; any can be returned as the response from a
-view. See :mod:`pyramid.httpexceptions` for the documentation for the
-``HTTPFound`` exception; it also includes other response types that imply
-other HTTP response codes, such as ``HTTPUnauthorized`` for ``401
-Unauthorized``.
+An HTTP exception, instead of being raised, can alternately be *returned*
+(HTTP exceptions are also valid response objects):
-.. note::
+.. code-block:: python
+ :linenos:
- Although exception types from the :mod:`pyramid.httpexceptions` module are
- in fact bona fide Python :class:`Exception` types, the :app:`Pyramid` view
- machinery expects them to be *returned* by a view callable rather than
- *raised*.
+ from pyramid.httpexceptions import HTTPUnauthorized
- It is possible, however, in Python 2.5 and above, to configure an
- *exception view* to catch these exceptions, and return an appropriate
- :class:`~pyramid.response.Response`. The simplest such view could just
- catch and return the original exception. See :ref:`exception_views` for
- more details.
+ def aview(request):
+ return HTTPUnauthorized()
-.. index::
- single: view exceptions
+A shortcut for creating an HTTP exception is the
+:func:`pyramid.httpexceptions.responsecode` function. This function accepts
+an HTTP status code and returns the corresponding HTTP exception. For
+example, instead of importing and constructing a
+:class:`~pyramid.httpexceptions.HTTPUnauthorized` response object, you can
+use the :func:`~pyramid.httpexceptions.responsecode` function to construct
+and return the same object.
-.. _special_exceptions_in_callables:
+.. code-block:: python
+ :linenos:
-Using Special Exceptions In View Callables
-------------------------------------------
+ from pyramid.httpexceptions import responsecode
-Usually when a Python exception is raised within a view callable,
-:app:`Pyramid` allows the exception to propagate all the way out to the
-:term:`WSGI` server which invoked the application.
+ def aview(request):
+ raise responsecode(401)
+
+This is the case because ``401`` is the HTTP status code for "HTTP
+Unauthorized". Therefore, ``raise responsecode(401)`` is functionally
+equivalent to ``raise HTTPUnauthorized()``. Documentation which maps each
+HTTP response code to its purpose and its associated HTTP exception object is
+provided within :mod:`pyramid.httpexceptions`.
-However, for convenience, two special exceptions exist which are always
-handled by :app:`Pyramid` itself. These are
-:exc:`pyramid.exceptions.NotFound` and :exc:`pyramid.exceptions.Forbidden`.
-Both are exception classes which accept a single positional constructor
-argument: a ``message``.
+How Pyramid Uses HTTP Exceptions
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-If :exc:`~pyramid.exceptions.NotFound` is raised within view code, the result
-of the :term:`Not Found View` will be returned to the user agent which
-performed the request.
+HTTP exceptions are meant to be used directly by application application
+developers. However, Pyramid itself will raise two HTTP exceptions at
+various points during normal operations:
+:exc:`pyramid.httpexceptions.HTTPNotFound` and
+:exc:`pyramid.httpexceptions.HTTPForbidden`. Pyramid will raise the
+:exc:`~pyramid.httpexceptions.HTTPNotFound` exception are raised when it
+cannot find a view to service a request. Pyramid will raise the
+:exc:`~pyramid.httpexceptions.Forbidden` exception or when authorization was
+forbidden by a security policy.
-If :exc:`~pyramid.exceptions.Forbidden` is raised within view code, the result
-of the :term:`Forbidden View` will be returned to the user agent which
-performed the request.
+If :exc:`~pyramid.httpexceptions.HTTPNotFound` is raised by Pyramid itself or
+within view code, the result of the :term:`Not Found View` will be returned
+to the user agent which performed the request.
-In all cases, the message provided to the exception constructor is made
-available to the view which :app:`Pyramid` invokes as
-``request.exception.args[0]``.
+If :exc:`~pyramid.httpexceptions.HTTPForbidden` is raised by Pyramid itself
+within view code, the result of the :term:`Forbidden View` will be returned
+to the user agent which performed the request.
.. index::
single: exception views
.. _exception_views:
-Exception Views
----------------
+Custom Exception Views
+----------------------
-The machinery which allows the special :exc:`~pyramid.exceptions.NotFound` and
-:exc:`~pyramid.exceptions.Forbidden` exceptions to be caught by specialized
-views as described in :ref:`special_exceptions_in_callables` can also be used
-by application developers to convert arbitrary exceptions to responses.
+The machinery which allows HTTP exceptions to be raised and caught by
+specialized views as described in :ref:`special_exceptions_in_callables` can
+also be used by application developers to convert arbitrary exceptions to
+responses.
To register a view that should be called whenever a particular exception is
raised from with :app:`Pyramid` view code, use the exception class or one of
@@ -359,6 +377,7 @@ raises a ``helloworld.exceptions.ValidationFailure`` exception:
.. code-block:: python
:linenos:
+ from pyramid.view import view_config
from helloworld.exceptions import ValidationFailure
@view_config(context=ValidationFailure)
@@ -370,8 +389,8 @@ raises a ``helloworld.exceptions.ValidationFailure`` exception:
Assuming that a :term:`scan` was run to pick up this view registration, this
view callable will be invoked whenever a
``helloworld.exceptions.ValidationFailure`` is raised by your application's
-view code. The same exception raised by a custom root factory or a custom
-traverser is also caught and hooked.
+view code. The same exception raised by a custom root factory, a custom
+traverser, or a custom view or route predicate is also caught and hooked.
Other normal view predicates can also be used in combination with an
exception view registration:
@@ -380,12 +399,13 @@ exception view registration:
:linenos:
from pyramid.view import view_config
- from pyramid.exceptions import NotFound
- from pyramid.httpexceptions import HTTPNotFound
+ from helloworld.exceptions import ValidationFailure
- @view_config(context=NotFound, route_name='home')
- def notfound_view(request):
- return HTTPNotFound()
+ @view_config(context=ValidationFailure, route_name='home')
+ def failed_validation(exc, request):
+ response = Response('Failed validation: %s' % exc.msg)
+ response.status_int = 500
+ return response
The above exception view names the ``route_name`` of ``home``, meaning that
it will only be called when the route matched has a name of ``home``. You
@@ -407,7 +427,45 @@ exception views which have a name will be ignored.
can use an exception as ``context`` for a normal view.
Exception views can be configured with any view registration mechanism:
-``@view_config`` decorator, ZCML, or imperative ``add_view`` styles.
+``@view_config`` decorator or imperative ``add_view`` styles.
+
+.. index::
+ single: view http redirect
+ single: http redirect (from a view)
+
+.. _http_redirect:
+
+Using a View Callable to Do an HTTP Redirect
+--------------------------------------------
+
+You can issue an HTTP redirect by using the
+:class:`pyramid.httpexceptions.HTTPFound` class. Raising or returning an
+instance of this class will cause the client to receive a "302 Found"
+response.
+
+To do so, you can *return* a :class:`pyramid.httpexceptions.HTTPFound`
+instance.
+
+.. code-block:: python
+ :linenos:
+
+ from pyramid.httpexceptions import HTTPFound
+
+ def myview(request):
+ return HTTPFound(location='http://example.com')
+
+Alternately, you can *raise* an HTTPFound exception instead of returning one.
+
+.. code-block:: python
+ :linenos:
+
+ from pyramid.httpexceptions import HTTPFound
+
+ def myview(request):
+ raise HTTPFound(location='http://example.com')
+
+When the instance is raised, it is caught by the default :term:`exception
+response` handler and turned into a response.
.. index::
single: unicode, views, and forms
diff --git a/docs/narr/webob.rst b/docs/narr/webob.rst
index 072ca1c74..0ff8e1de7 100644
--- a/docs/narr/webob.rst
+++ b/docs/narr/webob.rst
@@ -10,15 +10,15 @@ Request and Response Objects
.. note:: This chapter is adapted from a portion of the :term:`WebOb`
documentation, originally written by Ian Bicking.
-:app:`Pyramid` uses the :term:`WebOb` package to supply
+:app:`Pyramid` uses the :term:`WebOb` package as a basis for its
:term:`request` and :term:`response` object implementations. The
-:term:`request` object that is passed to a :app:`Pyramid`
-:term:`view` is an instance of the :class:`pyramid.request.Request`
-class, which is a subclass of :class:`webob.Request`. The
-:term:`response` returned from a :app:`Pyramid` :term:`view`
-:term:`renderer` is an instance of the :mod:`webob.Response` class.
-Users can also return an instance of :mod:`webob.Response` directly
-from a view as necessary.
+:term:`request` object that is passed to a :app:`Pyramid` :term:`view` is an
+instance of the :class:`pyramid.request.Request` class, which is a subclass
+of :class:`webob.Request`. The :term:`response` returned from a
+:app:`Pyramid` :term:`view` :term:`renderer` is an instance of the
+:mod:`pyramid.response.Response` class, which is a subclass of the
+:class:`webob.Response` class. Users can also return an instance of
+:class:`pyramid.response.Response` directly from a view as necessary.
WebOb is a project separate from :app:`Pyramid` with a separate set of
authors and a fully separate `set of documentation
@@ -26,16 +26,15 @@ authors and a fully separate `set of documentation
standard WebOb request, which is documented in the :ref:`request_module` API
documentation.
-WebOb provides objects for HTTP requests and responses. Specifically
-it does this by wrapping the `WSGI <http://wsgi.org>`_ request
-environment and response status/headers/app_iter (body).
+WebOb provides objects for HTTP requests and responses. Specifically it does
+this by wrapping the `WSGI <http://wsgi.org>`_ request environment and
+response status, header list, and app_iter (body) values.
-WebOb request and response objects provide many conveniences for
-parsing WSGI requests and forming WSGI responses. WebOb is a nice way
-to represent "raw" WSGI requests and responses; however, we won't
-cover that use case in this document, as users of :app:`Pyramid`
-don't typically need to use the WSGI-related features of WebOb
-directly. The `reference documentation
+WebOb request and response objects provide many conveniences for parsing WSGI
+requests and forming WSGI responses. WebOb is a nice way to represent "raw"
+WSGI requests and responses; however, we won't cover that use case in this
+document, as users of :app:`Pyramid` don't typically need to use the
+WSGI-related features of WebOb directly. The `reference documentation
<http://pythonpaste.org/webob/reference.html>`_ shows many examples of
creating requests and using response objects in this manner, however.
@@ -170,9 +169,9 @@ of the request. I'll show various values for an example URL
Methods
+++++++
-There are `several methods
-<http://pythonpaste.org/webob/class-webob.Request.html#__init__>`_ but
-only a few you'll use often:
+There are methods of request objects documented in
+:class:`pyramid.request.Request` but you'll find that you won't use very many
+of them. Here are a couple that might be useful:
``Request.blank(base_url)``:
Creates a new request with blank information, based at the given
@@ -183,9 +182,9 @@ only a few you'll use often:
subrequests).
``req.get_response(wsgi_application)``:
- This method calls the given WSGI application with this request,
- and returns a `Response`_ object. You can also use this for
- subrequests, or testing.
+ This method calls the given WSGI application with this request, and
+ returns a :class:`pyramid.response.Response` object. You can also use
+ this for subrequests, or testing.
.. index::
single: request (and unicode)
@@ -259,8 +258,10 @@ Response
~~~~~~~~
The :app:`Pyramid` response object can be imported as
-:class:`pyramid.response.Response`. This import location is merely a facade
-for its original location: ``webob.Response``.
+:class:`pyramid.response.Response`. This class is a subclass of the
+``webob.Response`` class. The subclass does not add or change any
+functionality, so the WebOb Response documentation will be completely
+relevant for this class as well.
A response object has three fundamental parts:
@@ -283,8 +284,8 @@ A response object has three fundamental parts:
``response.body_file`` (a file-like object; writing to it appends
to ``app_iter``).
-Everything else in the object derives from this underlying state.
-Here's the highlights:
+Everything else in the object typically derives from this underlying state.
+Here are some highlights:
``response.content_type``
The content type *not* including the ``charset`` parameter.
@@ -359,16 +360,18 @@ Exception Responses
+++++++++++++++++++
To facilitate error responses like ``404 Not Found``, the module
-:mod:`webob.exc` contains classes for each kind of error response. These
-include boring, but appropriate error bodies. The exceptions exposed by this
-module, when used under :app:`Pyramid`, should be imported from the
-:mod:`pyramid.httpexceptions` "facade" module. This import location is merely
-a facade for the original location of these exceptions: ``webob.exc``.
-
-Each class is named ``pyramid.httpexceptions.HTTP*``, where ``*`` is the reason
-for the error. For instance, :class:`pyramid.httpexceptions.HTTPNotFound`. It
-subclasses :class:`pyramid.Response`, so you can manipulate the instances in
-the same way. A typical example is:
+:mod:`pyramid.httpexceptions` contains classes for each kind of error
+response. These include boring, but appropriate error bodies. The
+exceptions exposed by this module, when used under :app:`Pyramid`, should be
+imported from the :mod:`pyramid.httpexceptions` module. This import location
+contains subclasses and replacements that mirror those in the ``webob.exc``
+module.
+
+Each class is named ``pyramid.httpexceptions.HTTP*``, where ``*`` is the
+reason for the error. For instance,
+:class:`pyramid.httpexceptions.HTTPNotFound` subclasses
+:class:`pyramid.Response`, so you can manipulate the instances in the same
+way. A typical example is:
.. ignore-next-block
.. code-block:: python
@@ -381,33 +384,11 @@ the same way. A typical example is:
# or:
response = HTTPMovedPermanently(location=new_url)
-These are not exceptions unless you are using Python 2.5+, because
-they are new-style classes which are not allowed as exceptions until
-Python 2.5. To get an exception object use ``response.exception``.
-You can use this like:
-
-.. code-block:: python
- :linenos:
-
- from pyramid.httpexceptions import HTTPException
- from pyramid.httpexceptions import HTTPNotFound
-
- def aview(request):
- try:
- # ... stuff ...
- raise HTTPNotFound('No such resource').exception
- except HTTPException, e:
- return request.get_response(e)
-
-The exceptions are still WSGI applications, but you cannot set
-attributes like ``content_type``, ``charset``, etc. on these exception
-objects.
-
More Details
++++++++++++
More details about the response object API are available in the
-:mod:`pyramid.response` documentation. More details about exception responses
-are in the :mod:`pyramid.httpexceptions` API documentation. The `WebOb
-documentation <http://pythonpaste.org/webob>`_ is also useful.
+:mod:`pyramid.response` documentation. More details about exception
+responses are in the :mod:`pyramid.httpexceptions` API documentation. The
+`WebOb documentation <http://pythonpaste.org/webob>`_ is also useful.
diff --git a/docs/tutorials/wiki/authorization.rst b/docs/tutorials/wiki/authorization.rst
index 358c1d5eb..46c953f6d 100644
--- a/docs/tutorials/wiki/authorization.rst
+++ b/docs/tutorials/wiki/authorization.rst
@@ -145,17 +145,17 @@ callable.
The first view configuration decorator configures the ``login`` view callable
so it will be invoked when someone visits ``/login`` (when the context is a
Wiki and the view name is ``login``). The second decorator (with context of
-``pyramid.exceptions.Forbidden``) specifies a :term:`forbidden view`. This
-configures our login view to be presented to the user when :app:`Pyramid`
-detects that a view invocation can not be authorized. Because we've
-configured a forbidden view, the ``login`` view callable will be invoked
-whenever one of our users tries to execute a view callable that they are not
-allowed to invoke as determined by the :term:`authorization policy` in use.
-In our application, for example, this means that if a user has not logged in,
-and he tries to add or edit a Wiki page, he will be shown the login form.
-Before being allowed to continue on to the add or edit form, he will have to
-provide credentials that give him permission to add or edit via this login
-form.
+``pyramid.httpexceptions.HTTPForbidden``) specifies a :term:`forbidden view`.
+This configures our login view to be presented to the user when
+:app:`Pyramid` detects that a view invocation can not be authorized. Because
+we've configured a forbidden view, the ``login`` view callable will be
+invoked whenever one of our users tries to execute a view callable that they
+are not allowed to invoke as determined by the :term:`authorization policy`
+in use. In our application, for example, this means that if a user has not
+logged in, and he tries to add or edit a Wiki page, he will be shown the
+login form. Before being allowed to continue on to the add or edit form, he
+will have to provide credentials that give him permission to add or edit via
+this login form.
Changing Existing Views
~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/docs/tutorials/wiki/definingviews.rst b/docs/tutorials/wiki/definingviews.rst
index ae4fa6ffb..b111c9b4a 100644
--- a/docs/tutorials/wiki/definingviews.rst
+++ b/docs/tutorials/wiki/definingviews.rst
@@ -84,10 +84,12 @@ No renderer is necessary when a view returns a response object.
The ``view_wiki`` view callable always redirects to the URL of a Page
resource named "FrontPage". To do so, it returns an instance of the
:class:`pyramid.httpexceptions.HTTPFound` class (instances of which implement
-the WebOb :term:`response` interface). The :func:`pyramid.url.resource_url`
-API. :func:`pyramid.url.resource_url` constructs a URL to the ``FrontPage``
-page resource (e.g. ``http://localhost:6543/FrontPage``), and uses it as the
-"location" of the HTTPFound response, forming an HTTP redirect.
+the :class:`pyramid.interfaces.IResponse` interface like
+:class:`pyramid.response.Response` does). The
+:func:`pyramid.url.resource_url` API. :func:`pyramid.url.resource_url`
+constructs a URL to the ``FrontPage`` page resource
+(e.g. ``http://localhost:6543/FrontPage``), and uses it as the "location" of
+the HTTPFound response, forming an HTTP redirect.
The ``view_page`` view function
-------------------------------
diff --git a/docs/tutorials/wiki/src/authorization/tutorial/login.py b/docs/tutorials/wiki/src/authorization/tutorial/login.py
index 463db71a6..334115880 100644
--- a/docs/tutorials/wiki/src/authorization/tutorial/login.py
+++ b/docs/tutorials/wiki/src/authorization/tutorial/login.py
@@ -9,7 +9,7 @@ from tutorial.security import USERS
@view_config(context='tutorial.models.Wiki', name='login',
renderer='templates/login.pt')
-@view_config(context='pyramid.exceptions.Forbidden',
+@view_config(context='pyramid.httpexceptions.HTTPForbidden',
renderer='templates/login.pt')
def login(request):
login_url = resource_url(request.context, request, 'login')
diff --git a/docs/tutorials/wiki2/definingviews.rst b/docs/tutorials/wiki2/definingviews.rst
index cea376b77..c91d1d914 100644
--- a/docs/tutorials/wiki2/definingviews.rst
+++ b/docs/tutorials/wiki2/definingviews.rst
@@ -91,7 +91,8 @@ a URL which represents the path to our "FrontPage".
The ``view_wiki`` function returns an instance of the
:class:`pyramid.httpexceptions.HTTPFound` class (instances of which implement
-the WebOb :term:`response` interface), It will use the
+the :class:`pyramid.interfaces.IResponse` interface like
+:class:`pyramid.response.Response` does), It will use the
:func:`pyramid.url.route_url` API to construct a URL to the ``FrontPage``
page (e.g. ``http://localhost:6543/FrontPage``), and will use it as the
"location" of the HTTPFound response, forming an HTTP redirect.
diff --git a/docs/tutorials/wiki2/src/authorization/tutorial/__init__.py b/docs/tutorials/wiki2/src/authorization/tutorial/__init__.py
index 05183d3d4..4cd84eda5 100644
--- a/docs/tutorials/wiki2/src/authorization/tutorial/__init__.py
+++ b/docs/tutorials/wiki2/src/authorization/tutorial/__init__.py
@@ -39,7 +39,7 @@ def main(global_config, **settings):
config.add_view('tutorial.views.edit_page', route_name='edit_page',
renderer='tutorial:templates/edit.pt', permission='edit')
config.add_view('tutorial.login.login',
- context='pyramid.exceptions.Forbidden',
+ context='pyramid.httpexceptions.HTTPForbidden',
renderer='tutorial:templates/login.pt')
return config.make_wsgi_app()
diff --git a/docs/whatsnew-1.1.rst b/docs/whatsnew-1.1.rst
index ce2f7210a..172a20343 100644
--- a/docs/whatsnew-1.1.rst
+++ b/docs/whatsnew-1.1.rst
@@ -18,6 +18,9 @@ The major feature additions in Pyramid 1.1 are:
- Support for "static" routes.
+- Default HTTP exception view and associated ``redirect`` and ``abort``
+ convenience functions.
+
``request.response``
~~~~~~~~~~~~~~~~~~~~
@@ -50,6 +53,25 @@ Static Routes
be useful for URL generation via ``route_url`` and ``route_path``. See the
section entitled :ref:`static_route_narr` for more information.
+Default HTTP Exception View
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- A default exception view for the context :exc:`webob.exc.HTTPException`
+ (aka :class:`pyramid.httpexceptions.HTTPException`) is now registered by
+ default. This means that an instance of any exception class imported from
+ :mod:`pyramid.httpexceptions` (such as ``HTTPFound``) can now be raised
+ from within view code; when raised, this exception view will render the
+ exception to a response.
+
+ To allow for configuration of this feature, the :term:`Configurator` now
+ accepts an additional keyword argument named ``httpexception_view``. By
+ default, this argument is populated with a default exception view function
+ that will be used when an HTTP exception is raised. When ``None`` is
+ passed for this value, an exception view for HTTP exceptions will not be
+ registered. Passing ``None`` returns the behavior of raising an HTTP
+ exception to that of Pyramid 1.0 (the exception will propagate to
+ middleware and to the WSGI server).
+
Minor Feature Additions
-----------------------
@@ -57,6 +79,10 @@ Minor Feature Additions
:class:`pyramid.authentication.SessionAuthenticationPolicy`, which uses a
session to store credentials.
+- A function named :func:`pyramid.httpexceptions.responsecode` is a shortcut
+ that can be used to create HTTP exception response objects using an HTTP
+ integer status code.
+
- Integers and longs passed as ``elements`` to
:func:`pyramid.url.resource_url` or
:meth:`pyramid.request.Request.resource_url` e.g. ``resource_url(context,
@@ -162,7 +188,7 @@ Deprecations and Behavior Differences
expected an environ object in BFG 1.0 and before). In a future version,
these methods will be removed entirely.
-- A custom request factory is now required to return a response object that
+- A custom request factory is now required to return a request object that
has a ``response`` attribute (or "reified"/lazy property) if they the
request is meant to be used in a view that uses a renderer. This
``response`` attribute should be an instance of the class
@@ -235,3 +261,10 @@ Documentation Enhancements
- Added a section to the "URL Dispatch" narrative chapter regarding the new
"static" route feature entitled :ref:`static_route_narr`.
+
+- Added API docs for :func:`pyramid.httpexceptions.abort` and
+ :func:`pyramid.httpexceptions.redirect`.
+
+- Added :ref:`http_exceptions` section to Views narrative chapter including a
+ description of :func:`pyramid.httpexceptions.abort`` and
+ :func:`pyramid.httpexceptions.redirect`.