Content-Type: text/x-zim-wiki Wiki-Format: zim 0.4 Creation-Date: 2011-10-21T21:07:01+08:00 ====== Request and response objects ====== Created Friday 21 October 2011 ===== Quick overview ===== Django uses request and response objects to pass state through the system. When a page is requested, Django creates an **HttpRequest **object that contains //metadata //about the request. Then Django loads the appropriate **view**, passing the **HttpRequest** as the first argument to the view function. Each view is responsible for returning an **HttpResponse** object. This document explains the APIs for HttpRequest and HttpResponse objects. ===== HttpRequest objects ===== ==== class ==== HttpRequest ==== Attributes ==== All attributes except **session** should be considered //read-only.// **HttpRequest.path** A string representing the //full path// to the //requested page//, not including the domain. Example: "/music/bands/the_beatles/" **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 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. SetHandler python-program PythonHandler django.core.handlers.modpython SetEnv DJANGO_SETTINGS_MODULE mysite.settings PythonOption //django.root /mysite// PythonDebug On 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/". 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() HttpRequest.encoding A string representing the current encoding used to decode form submission data (or None, which means the 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 DEFAULT_CHARSET encoding. HttpRequest.GET A dictionary-like object containing all given HTTP GET parameters. See the QueryDict documentation below. HttpRequest.POST A dictionary-like object containing all given HTTP POST parameters. See the 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. 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. HttpRequest.COOKIES A standard Python dictionary containing all cookies. Keys and values are strings. 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 UploadedFile as described below. See Managing 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. 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 -- the length of the request body (as a string). CONTENT_TYPE -- the MIME type of the request body. HTTP_ACCEPT_ENCODING -- Acceptable encodings for the response. HTTP_ACCEPT_LANGUAGE -- Acceptable languages for the response. 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 (as a string). 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. 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 User authentication in Django. 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 session documentation for full details. HttpRequest.raw_post_data The raw HTTP POST data as a byte string. This is useful for processing data in different formats than of conventional HTML forms: binary images, XML payload etc. For processing form data use HttpRequest.POST. New in Django 1.3: Please, see the release notes You can also read from an HttpRequest using file-like interface. See HttpRequest.read(). 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 ROOT_URLCONF setting. See How Django processes a request for details. Methods HttpRequest.get_host() Returns the originating host of the request using information from the HTTP_X_FORWARDED_HOST (if enabled in the settings) 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 3333. Example: "127.0.0.1:8000" Note The 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() HttpRequest.get_full_path() Returns the path, plus an appended query string, if applicable. Example: "/music/bands/the_beatles/?print=true" 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" HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) New in Django Development version. Returns a cookie value for a signed cookie, or raises a BadSignature exception if the signature is no longer valid. If you provide the default argument the exception will be suppressed and that default value will be returned instead. The optional salt argument can be used to provide extra protection against brute force attacks on your secret key. If supplied, the max_age argument will be checked against the signed timestamp attached to the cookie value to ensure the cookie is not older than max_age seconds. For example: >>> request.get_signed_cookie('name') 'Tony' >>> request.get_signed_cookie('name', salt='name-salt') 'Tony' # assuming cookie was set using the same salt >>> request.get_signed_cookie('non-existing-cookie') ... KeyError: 'non-existing-cookie' >>> request.get_signed_cookie('non-existing-cookie', False) False >>> request.get_signed_cookie('cookie-that-was-tampered-with') ... BadSignature: ... >>> request.get_signed_cookie('name', max_age=60) ... SignatureExpired: Signature age 1677.3839159 > 60 seconds >>> request.get_signed_cookie('name', False, max_age=60) False See cryptographic signing for more information. HttpRequest.is_secure() Returns True if the request is secure; that is, if it was made with HTTPS. 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. HttpRequest.read(size=None) HttpRequest.readline() HttpRequest.readlines() HttpRequest.xreadlines() HttpRequest.__iter__() New in Django 1.3: Please, see the release notes Methods implementing a file-like interface for reading from an HttpRequest instance. This makes it possible to consume an incoming request in a streaming fashion. A common use-case would be to process a big XML payload with iterative parser without constructing a whole XML tree in memory. Given this standard interface, an HttpRequest instance can be passed directly to an XML parser such as ElementTree: import xml.etree.ElementTree as ET for element in ET.iterparse(request): process(element) UploadedFile objects class UploadedFile Attributes UploadedFile.name The name of the uploaded file. UploadedFile.size The size, in bytes, of the uploaded file. Methods UploadedFile.chunks(chunk_size=None) Returns a generator that yields sequential chunks of data. UploadedFile.read(num_bytes=None) Read a number of bytes from the file. QueryDict objects class QueryDict In an HttpRequest object, the GET and POST attributes are instances of django.http.QueryDict. 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