Home | History | Annotate | Download | only in guide
      1 .. _guide.request:
      2 
      3 Request data
      4 ============
      5 The request handler instance can access the request data using its ``request``
      6 property. This is initialized to a populated `WebOb`_ ``Request`` object by
      7 the application.
      8 
      9 The request object provides a ``get()`` method that returns values for
     10 arguments parsed from the query and from POST data. The method takes the
     11 argument name as its first parameter. For example::
     12 
     13     class MyHandler(webapp2.RequestHandler):
     14         def post(self):
     15             name = self.request.get('name')
     16 
     17 By default, ``get()`` returns the empty string (``''``) if the requested
     18 argument is not in the request. If the parameter ``default_value`` is
     19 specified, ``get()`` returns the value of that parameter instead of the empty
     20 string if the argument is not present.
     21 
     22 If the argument appears more than once in a request, by default ``get()``
     23 returns the first occurrence. To get all occurrences of an argument that might
     24 appear more than once as a list (possibly empty), give ``get()`` the argument
     25 ``allow_multiple=True``::
     26 
     27     # <input name="name" type="text" />
     28     name = self.request.get("name")
     29 
     30     # <input name="subscribe" type="checkbox" value="yes" />
     31     subscribe_to_newsletter = self.request.get("subscribe", default_value="no")
     32 
     33     # <select name="favorite_foods" multiple="true">...</select>
     34     favorite_foods = self.request.get("favorite_foods", allow_multiple=True)
     35 
     36     # for food in favorite_foods:
     37     # ...
     38 
     39 For requests with body content that is not a set of CGI parameters, such as
     40 the body of an HTTP PUT request, the request object provides the attributes
     41 ``body`` and ``body_file``: ``body`` is the body content as a byte string and
     42 ``body_file`` provides a file-like interface to the same data::
     43 
     44     uploaded_file = self.request.body
     45 
     46 
     47 GET data
     48 --------
     49 Query string variables are available in ``request.GET``.
     50 
     51 ``.GET`` is a `MultiDict`_: it is like a dictionary but the same key can have
     52 multiple values. When you call ``.get(key)`` for a key with multiple values,
     53 the last value is returned. To get all values for a key, use ``.getall(key)``.
     54 Examples::
     55 
     56     request = Request.blank('/test?check=a&check=b&name=Bob')
     57 
     58     # The whole MultiDict:
     59     # GET([('check', 'a'), ('check', 'b'), ('name', 'Bob')])
     60     get_values = request.GET
     61 
     62     # The last value for a key: 'b'
     63     check_value = request.GET['check']
     64 
     65     # All values for a key: ['a', 'b']
     66     check_values = request.GET.getall('check')
     67 
     68     # An iterable with alll items in the MultiDict:
     69     # [('check', 'a'), ('check', 'b'), ('name', 'Bob')]
     70     request.GET.items()
     71 
     72 The name ``GET`` is a bit misleading, but has historical reasons:
     73 ``request.GET`` is not only available when the HTTP method is GET. It is
     74 available for any request with query strings in the URI, for any HTTP method:
     75 GET, POST, PUT etc.
     76 
     77 
     78 POST data
     79 ---------
     80 Variables url encoded in the body of a request (generally a POST form submitted
     81 using the ``application/x-www-form-urlencoded`` media type) are available in
     82 ``request.POST``.
     83 
     84 It is also a `MultiDict`_ and can be accessed in the same way as ``.GET``.
     85 Examples::
     86 
     87     request = Request.blank('/')
     88     request.method = 'POST'
     89     request.body = 'check=a&check=b&name=Bob'
     90 
     91     # The whole MultiDict:
     92     # POST([('check', 'a'), ('check', 'b'), ('name', 'Bob')])
     93     post_values = request.POST
     94 
     95     # The last value for a key: 'b'
     96     check_value = request.POST['check']
     97 
     98     # All values for a key: ['a', 'b']
     99     check_values = request.POST.getall('check')
    100 
    101     # An iterable with alll items in the MultiDict:
    102     # [('check', 'a'), ('check', 'b'), ('name', 'Bob')]
    103     request.POST.items()
    104 
    105 Like ``GET``, the name ``POST`` is a somewjat misleading, but has historical
    106 reasons: they are also available when the HTTP method is PUT, and not only
    107 POST.
    108 
    109 
    110 GET + POST data
    111 ---------------
    112 ``request.params`` combines the variables from ``GET`` and ``POST``. It can be
    113 used when you don't care where the variable comes from.
    114 
    115 
    116 Files
    117 -----
    118 Uploaded files are available as ``cgi.FieldStorage`` (see the :py:mod:`cgi`
    119 module) instances directly in ``request.POST``.
    120 
    121 
    122 .. _guide.request.cookies:
    123 
    124 Cookies
    125 -------
    126 Cookies can be accessed in ``request.cookies``. It is a simple dictionary::
    127 
    128     request = Request.blank('/')
    129     request.headers['Cookie'] = 'test=value'
    130 
    131     # A value: 'value'
    132     cookie_value = request.cookies.get('test')
    133 
    134 .. seealso::
    135    :ref:`How to set cookies using the response object <guide.response.setting-cookies>`
    136 
    137 
    138 Common Request attributes
    139 -------------------------
    140 body
    141   A file-like object that gives the body of the request.
    142 content_type
    143   Content-type of the request body.
    144 method
    145   The HTTP method, e.g., 'GET' or 'POST'.
    146 url
    147   Full URI, e.g., ``'http://localhost/blog/article?id=1'``.
    148 scheme
    149   URI scheme, e.g., 'http' or 'https'.
    150 host
    151   URI host, e.g., ``'localhost:80'``.
    152 host_url
    153   URI host including scheme, e.g., ``'http://localhost'``.
    154 path_url
    155   URI host including scheme and path, e.g., ``'http://localhost/blog/article'``.
    156 path
    157   URI path, e.g., ``'/blog/article'``.
    158 path_qs
    159   URI path including the query string, e.g., ``'/blog/article?id=1'``.
    160 query_string
    161   Query string, e.g., ``id=1``.
    162 headers
    163   A dictionary like object with request headers. Keys are case-insensitive.
    164 GET
    165   A dictionary-like object with variables from the query string, as unicode.
    166 POST
    167   A dictionary-like object with variables from a POST form, as unicode.
    168 params
    169   A dictionary-like object combining the variables GET and POST.
    170 cookies
    171   A dictionary-like object with cookie values.
    172 
    173 
    174 Extra attributes
    175 ----------------
    176 The parameters from the matched :class:`webapp2.Route` are set as attributes
    177 of the request object. They are ``request.route_args``, for positional
    178 arguments, and ``request.route_kwargs``, for keyword arguments. The matched
    179 route object is available as ``request.route``.
    180 
    181 A reference to the active WSGI application is also set as an attribute of the
    182 request. You can access it in ``request.app``.
    183 
    184 
    185 Getting the current request
    186 ---------------------------
    187 The active ``Request`` instance can be accessed during a request using the
    188 function :func:`webapp2.get_request`.
    189 
    190 
    191 .. _guide.request.registry:
    192 
    193 Registry
    194 --------
    195 A simple dictionary is available in the request object to register instances
    196 that are shared during a request: it is the :attr:`webapp2.Request.registry`
    197 attribute.
    198 
    199 A registry dictionary is also available in the
    200 :ref:`WSGI application object <guide.app.registry>`, to store objects shared
    201 across requests.
    202 
    203 
    204 Learn more about WebOb
    205 ----------------------
    206 WebOb is an open source third-party library. See the `WebOb`_ documentation
    207 for a detailed API reference and examples.
    208 
    209 
    210 .. _WebOb: http://docs.webob.org/
    211 .. _MultiDict: http://pythonpaste.org/webob/class-webob.multidict.MultiDict.html
    212