diff -r 5ff1fc726848 -r c6bca38c1cbf parts/django/docs/ref/request-response.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/parts/django/docs/ref/request-response.txt Sat Jan 08 11:20:57 2011 +0530 @@ -0,0 +1,646 @@ +============================ +Request and response objects +============================ + +.. module:: django.http + :synopsis: Classes dealing with HTTP requests and responses. + +Quick overview +============== + +Django uses request and response objects to pass state through the system. + +When a page is requested, Django creates an :class:`HttpRequest` object that +contains metadata about the request. Then Django loads the appropriate view, +passing the :class:`HttpRequest` as the first argument to the view function. +Each view is responsible for returning an :class:`HttpResponse` object. + +This document explains the APIs for :class:`HttpRequest` and +:class:`HttpResponse` objects. + +HttpRequest objects +=================== + +.. class:: HttpRequest + +Attributes +---------- + +All attributes except ``session`` should be considered read-only. + +.. attribute:: HttpRequest.path + + A string representing the full path to the requested page, not including + the domain. + + Example: ``"/music/bands/the_beatles/"`` + +.. attribute:: HttpRequest.path_info + + Under some web server configurations, the portion of the URL after the host + name is split up into a script prefix portion and a path info portion + (this happens, for example, when using the ``django.root`` option + with the :ref:`modpython handler from Apache `). + The ``path_info`` attribute always contains the path info portion of the + path, no matter what web server is being used. Using this instead of + attr:`~HttpRequest.path` can make your code much easier to move between test + and deployment servers. + + For example, if the ``django.root`` for your application is set to + ``"/minfo"``, then ``path`` might be ``"/minfo/music/bands/the_beatles/"`` + and ``path_info`` would be ``"/music/bands/the_beatles/"``. + +.. attribute:: HttpRequest.method + + A string representing the HTTP method used in the request. This is + guaranteed to be uppercase. Example:: + + if request.method == 'GET': + do_something() + elif request.method == 'POST': + do_something_else() + +.. attribute:: HttpRequest.encoding + + A string representing the current encoding used to decode form submission + data (or ``None``, which means the :setting:`DEFAULT_CHARSET` setting is + used). You can write to this attribute to change the encoding used when + accessing the form data. Any subsequent attribute accesses (such as reading + from ``GET`` or ``POST``) will use the new ``encoding`` value. Useful if + you know the form data is not in the :setting:`DEFAULT_CHARSET` encoding. + +.. attribute:: HttpRequest.GET + + A dictionary-like object containing all given HTTP GET parameters. See the + :class:`QueryDict` documentation below. + +.. attribute:: HttpRequest.POST + + A dictionary-like object containing all given HTTP POST parameters. See the + :class:`QueryDict` documentation below. + + It's possible that a request can come in via POST with an empty ``POST`` + dictionary -- if, say, a form is requested via the POST HTTP method but + does not include form data. Therefore, you shouldn't use ``if request.POST`` + to check for use of the POST method; instead, use ``if request.method == + "POST"`` (see above). + + Note: ``POST`` does *not* include file-upload information. See ``FILES``. + +.. attribute:: HttpRequest.REQUEST + + For convenience, a dictionary-like object that searches ``POST`` first, + then ``GET``. Inspired by PHP's ``$_REQUEST``. + + For example, if ``GET = {"name": "john"}`` and ``POST = {"age": '34'}``, + ``REQUEST["name"]`` would be ``"john"``, and ``REQUEST["age"]`` would be + ``"34"``. + + It's strongly suggested that you use ``GET`` and ``POST`` instead of + ``REQUEST``, because the former are more explicit. + +.. attribute:: HttpRequest.COOKIES + + A standard Python dictionary containing all cookies. Keys and values are + strings. + +.. attribute:: HttpRequest.FILES + + A dictionary-like object containing all uploaded files. Each key in + ``FILES`` is the ``name`` from the ````. Each + value in ``FILES`` is an :class:`UploadedFile` as described below. + + See :doc:`/topics/files` for more information. + + Note that ``FILES`` will only contain data if the request method was POST + and the ``
`` that posted to the request had + ``enctype="multipart/form-data"``. Otherwise, ``FILES`` will be a blank + dictionary-like object. + + .. versionchanged:: 1.0 + + In previous versions of Django, ``request.FILES`` contained simple ``dict`` + objects representing uploaded files. This is no longer true -- files are + represented by :class:`UploadedFile` objects. + + These :class:`UploadedFile` objects will emulate the old-style ``dict`` + interface, but this is deprecated and will be removed in the next release + of Django. + +.. attribute:: HttpRequest.META + + A standard Python dictionary containing all available HTTP headers. + Available headers depend on the client and server, but here are some + examples: + + * ``CONTENT_LENGTH`` + * ``CONTENT_TYPE`` + * ``HTTP_ACCEPT_ENCODING`` + * ``HTTP_ACCEPT_LANGUAGE`` + * ``HTTP_HOST`` -- The HTTP Host header sent by the client. + * ``HTTP_REFERER`` -- The referring page, if any. + * ``HTTP_USER_AGENT`` -- The client's user-agent string. + * ``QUERY_STRING`` -- The query string, as a single (unparsed) string. + * ``REMOTE_ADDR`` -- The IP address of the client. + * ``REMOTE_HOST`` -- The hostname of the client. + * ``REMOTE_USER`` -- The user authenticated by the Web server, if any. + * ``REQUEST_METHOD`` -- A string such as ``"GET"`` or ``"POST"``. + * ``SERVER_NAME`` -- The hostname of the server. + * ``SERVER_PORT`` -- The port of the server. + + With the exception of ``CONTENT_LENGTH`` and ``CONTENT_TYPE``, as given + above, any HTTP headers in the request are converted to ``META`` keys by + converting all characters to uppercase, replacing any hyphens with + underscores and adding an ``HTTP_`` prefix to the name. So, for example, a + header called ``X-Bender`` would be mapped to the ``META`` key + ``HTTP_X_BENDER``. + +.. attribute:: HttpRequest.user + + A ``django.contrib.auth.models.User`` object representing the currently + logged-in user. If the user isn't currently logged in, ``user`` will be set + to an instance of ``django.contrib.auth.models.AnonymousUser``. You + can tell them apart with ``is_authenticated()``, like so:: + + if request.user.is_authenticated(): + # Do something for logged-in users. + else: + # Do something for anonymous users. + + ``user`` is only available if your Django installation has the + ``AuthenticationMiddleware`` activated. For more, see + :doc:`/topics/auth`. + +.. attribute:: HttpRequest.session + + A readable-and-writable, dictionary-like object that represents the current + session. This is only available if your Django installation has session + support activated. See the :doc:`session documentation + ` for full details. + +.. attribute:: HttpRequest.raw_post_data + + The raw HTTP POST data. This is only useful for advanced processing. Use + ``POST`` instead. + +.. attribute:: HttpRequest.urlconf + + Not defined by Django itself, but will be read if other code (e.g., a custom + middleware class) sets it. When present, this will be used as the root + URLconf for the current request, overriding the :setting:`ROOT_URLCONF` + setting. See :ref:`how-django-processes-a-request` for details. + +Methods +------- + +.. method:: HttpRequest.get_host() + + Returns the originating host of the request using information from the + ``HTTP_X_FORWARDED_HOST`` and ``HTTP_HOST`` headers (in that order). If + they don't provide a value, the method uses a combination of + ``SERVER_NAME`` and ``SERVER_PORT`` as detailed in `PEP 333`_. + + .. _PEP 333: http://www.python.org/dev/peps/pep-0333/ + + Example: ``"127.0.0.1:8000"`` + + .. note:: The :meth:`~HttpRequest.get_host()` method fails when the host is + behind multiple proxies. One solution is to use middleware to rewrite + the proxy headers, as in the following example:: + + class MultipleProxyMiddleware(object): + FORWARDED_FOR_FIELDS = [ + 'HTTP_X_FORWARDED_FOR', + 'HTTP_X_FORWARDED_HOST', + 'HTTP_X_FORWARDED_SERVER', + ] + + def process_request(self, request): + """ + Rewrites the proxy headers so that only the most + recent proxy is used. + """ + for field in self.FORWARDED_FOR_FIELDS: + if field in request.META: + if ',' in request.META[field]: + parts = request.META[field].split(',') + request.META[field] = parts[-1].strip() + + +.. method:: HttpRequest.get_full_path() + + Returns the ``path``, plus an appended query string, if applicable. + + Example: ``"/music/bands/the_beatles/?print=true"`` + +.. method:: HttpRequest.build_absolute_uri(location) + + Returns the absolute URI form of ``location``. If no location is provided, + the location will be set to ``request.get_full_path()``. + + If the location is already an absolute URI, it will not be altered. + Otherwise the absolute URI is built using the server variables available in + this request. + + Example: ``"http://example.com/music/bands/the_beatles/?print=true"`` + +.. method:: HttpRequest.is_secure() + + Returns ``True`` if the request is secure; that is, if it was made with + HTTPS. + +.. method:: HttpRequest.is_ajax() + + Returns ``True`` if the request was made via an ``XMLHttpRequest``, by + checking the ``HTTP_X_REQUESTED_WITH`` header for the string + ``'XMLHttpRequest'``. Most modern JavaScript libraries send this header. + If you write your own XMLHttpRequest call (on the browser side), you'll + have to set this header manually if you want ``is_ajax()`` to work. + + +UploadedFile objects +==================== + +.. class:: UploadedFile + + +Attributes +---------- + +.. attribute:: UploadedFile.name + + The name of the uploaded file. + +.. attribute:: UploadedFile.size + + The size, in bytes, of the uploaded file. + +Methods +---------- + +.. method:: UploadedFile.chunks(chunk_size=None) + + Returns a generator that yields sequential chunks of data. + +.. method:: UploadedFile.read(num_bytes=None) + + Read a number of bytes from the file. + + + +QueryDict objects +================= + +.. class:: QueryDict + +In an :class:`HttpRequest` object, the ``GET`` and ``POST`` attributes are instances +of ``django.http.QueryDict``. :class:`QueryDict` is a dictionary-like +class customized to deal with multiple values for the same key. This is +necessary because some HTML form elements, notably +``