summaryrefslogtreecommitdiff
path: root/docs/narr/webob.rst
diff options
context:
space:
mode:
Diffstat (limited to 'docs/narr/webob.rst')
-rw-r--r--docs/narr/webob.rst90
1 files changed, 81 insertions, 9 deletions
diff --git a/docs/narr/webob.rst b/docs/narr/webob.rst
index 0ff8e1de7..106024db3 100644
--- a/docs/narr/webob.rst
+++ b/docs/narr/webob.rst
@@ -22,9 +22,9 @@ of :class:`webob.Request`. The :term:`response` returned from a
WebOb is a project separate from :app:`Pyramid` with a separate set of
authors and a fully separate `set of documentation
-<http://pythonpaste.org/webob/>`_. Pyramid adds some functionality to the
-standard WebOb request, which is documented in the :ref:`request_module` API
-documentation.
+<http://docs.webob.org/en/latest/index.html>`_. Pyramid adds some
+functionality to the 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
@@ -35,7 +35,7 @@ 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
+<http://docs.webob.org/en/latest/reference.html>`_ shows many examples of
creating requests and using response objects in this manner, however.
.. index::
@@ -78,6 +78,10 @@ object:
``PUT``. You can also get ``req.body_file`` for a file-like
object.
+``req.json_body``
+ The JSON-decoded contents of the body of the request. See
+ :ref:`request_json_body`.
+
``req.cookies``:
A simple dictionary of all the cookies.
@@ -239,6 +243,73 @@ tuples; all the keys are ordered, and all the values are ordered.
API documentation for a multidict exists as
:class:`pyramid.interfaces.IMultiDict`.
+.. index::
+ pair: json_body; request
+
+.. _request_json_body:
+
+Dealing With A JSON-Encoded Request Body
+++++++++++++++++++++++++++++++++++++++++
+
+.. note:: this feature is new as of Pyramid 1.1.
+
+:attr:`pyramid.request.Request.json_body` is a property that returns a
+:term:`JSON` -decoded representation of the request body. If the request
+does not have a body, or the body is not a properly JSON-encoded value, an
+exception will be raised when this attribute is accessed.
+
+This attribute is useful when you invoke a Pyramid view callable via
+e.g. jQuery's ``$.ajax`` function, which has the potential to send a request
+with a JSON-encoded body.
+
+Using ``request.json_body`` is equivalent to:
+
+.. code-block:: python
+
+ from json import loads
+ loads(request.body, encoding=request.charset)
+
+Here's how to construct an AJAX request in Javascript using :term:`jQuery`
+that allows you to use the ``request.json_body`` attribute when the request
+is sent to a Pyramid application:
+
+.. code-block:: javascript
+
+ jQuery.ajax({type:'POST',
+ url: 'http://localhost:6543/', // the pyramid server
+ data: JSON.stringify({'a':1}),
+ contentType: 'application/json; charset=utf-8'});
+
+When such a request reaches a view in your application, the
+``request.json_body`` attribute will be available in the view callable body.
+
+.. code-block:: javascript
+
+ @view_config(renderer='string')
+ def aview(request):
+ print request.json_body
+ return 'OK'
+
+For the above view, printed to the console will be:
+
+.. code-block:: python
+
+ {u'a': 1}
+
+For bonus points, here's a bit of client-side code that will produce a
+request that has a body suitable for reading via ``request.json_body`` using
+Python's ``urllib2`` instead of a Javascript AJAX request:
+
+.. code-block:: python
+
+ import urllib2
+ import json
+
+ json_payload = json.dumps({'a':1})
+ headers = {'Content-Type':'application/json; charset=utf-8'}
+ req = urllib2.Request('http://localhost:6543/', json_payload, headers)
+ resp = urllib2.urlopen(req)
+
More Details
++++++++++++
@@ -246,8 +317,8 @@ More detail about the request object API is available in:
- The :class:`pyramid.request.Request` API documentation.
-- The `WebOb documentation <http://pythonpaste.org/webob>`_. All
- methods and attributes of a ``webob.Request`` documented within the
+- The `WebOb documentation <http://docs.webob.org/en/latest/index.html>`_.
+ All methods and attributes of a ``webob.Request`` documented within the
WebOb documentation will work with request objects created by
:app:`Pyramid`.
@@ -331,7 +402,7 @@ properties. These are parsed, so you can do things like
``response.last_modified = os.path.getmtime(filename)``.
The details are available in the `extracted Response documentation
-<http://pythonpaste.org/webob/class-webob.Response.html>`_.
+<http://docs.webob.org/en/latest/modules/webob.html#headers>`_.
.. index::
single: response (creating)
@@ -354,7 +425,7 @@ anything, though if you subclass :class:`pyramid.response.Response` and set
``default_content_type`` you can override this behavior.
.. index::
- single: response exceptions
+ single: exception responses
Exception Responses
+++++++++++++++++++
@@ -390,5 +461,6 @@ 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.
+`WebOb documentation <http://docs.webob.org/en/latest/index.html>`_ is also
+useful.