.. _guide.response:

Building a Response
===================
The request handler instance builds the response using its response property.
This is initialized to an empty `WebOb`_ ``Response`` object by the
application.

The response object's acts as a file-like object that can be used for
writing the body of the response::

    class MyHandler(webapp2.RequestHandler):
        def get(self):
            self.response.write("<html><body><p>Hi there!</p></body></html>")

The response buffers all output in memory, then sends the final output when
the handler exits. webapp2 does not support streaming data to the client.

The ``clear()`` method erases the contents of the output buffer, leaving it
empty.

If the data written to the output stream is a Unicode value, or if the
response includes a ``Content-Type`` header that ends with ``; charset=utf-8``,
webapp2 encodes the output as UTF-8. By default, the ``Content-Type`` header
is ``text/html; charset=utf-8``, including the encoding behavior. If the
``Content-Type`` is changed to have a different charset, webapp2 assumes the
output is a byte string to be sent verbatim.

.. warning:
   The ``status`` attribute from a response is the status code plus message,
   e.g., '200 OK'. This is different from webapp, which has the status code
   (an integer) stored in ``status``. In webapp2, the status code is stored
   in the ``status_int`` attribute, as in WebOb.


.. _guide.response.setting-cookies:

Setting cookies
---------------
Cookies are set in the response object. The methods to handle cookies are:

set_cookie(key, value='', max_age=None, path='/', domain=None, secure=None, httponly=False, comment=None, expires=None, overwrite=False)
  Sets a cookie.

delete_cookie(key, path='/', domain=None)
  Deletes a cookie previously set in the client.

unset_cookie(key)
  Unsets a cookie previously set in the response object. Note that this
  doesn't delete the cookie from clients, only from the response.

For example::

    # Saves a cookie in the client.
    response.set_cookie('some_key', 'value', max_age=360, path='/',
                        domain='example.org', secure=True)

    # Deletes a cookie previously set in the client.
    response.delete_cookie('bad_cookie')

    # Cancels a cookie previously set in the response.
    response.unset_cookie('some_key')

Only the ``key`` parameter is required. The parameters are:

key
  Cookie name.
value
  Cookie value.
expires
  An expiration date. Must be a :py:mod:`datetime`.datetime object. Use this
  instead of max_age since the former is not supported by Internet Explorer.
max_age
  Cookie max age in seconds.
path
  URI path in which the cookie is valid.
domain
  URI domain in which the cookie is valid.
secure
  If True, the cookie is only available via HTTPS.
httponly
  Disallow JavaScript to access the cookie.
comment
  Defines a cookie comment.
overwrite
  If true, overwrites previously set (and not yet sent to the client) cookies
  with the same name.

.. seealso::
   :ref:`How to read cookies from the request object <guide.request.cookies>`

Common Response attributes
--------------------------
status
  Status code plus message, e.g., '404 Not Found'. The status can be set
  passing an ``int``, e.g., ``request.status = 404``, or including the message,
  e.g., ``request.status = '404 Not Found'``.
status_int
  Status code as an ``int``, e.g., 404.
status_message
  Status message, e.g., 'Not Found'.
body
  The contents of the response, as a string.
unicode_body
  The contents of the response, as a unicode.
headers
  A dictionary-like object with headers. Keys are case-insensitive. It supports
  multiple values for a key, but you must use
  ``response.headers.add(key, value)`` to add keys. To get all values, use
  ``response.headers.getall(key)``.
headerlist
  List of headers, as a list of tuples ``(header_name, value)``.
charset
  Character encoding.
content_type
  'Content-Type' value from the headers, e.g., ``'text/html'``.
content_type_params
  Dictionary of extra Content-type parameters, e.g., ``{'charset': 'utf8'}``.
location
  'Location' header variable, used for redirects.
etag
  'ETag' header variable. You can automatically generate an etag based on the
  response body calling ``response.md5_etag()``.


Learn more about WebOb
----------------------
WebOb is an open source third-party library. See the `WebOb`_ documentation
for a detailed API reference and examples.


.. _WebOb: http://docs.webob.org/