=============================== WebOb request objects in Django =============================== *django-wsgi* extends Django's WSGI handler (:class:`django.core.handlers.wsgi.WSGIHandler`) and the :class:`~django.http.HttpRequest` class, so that our handler can use our extended request class. As mentioned before, what Django calls "handler" is actually a generic WSGI application that wraps your Django project. We'll stick to "WSGI application" from now on. This extended WSGI application offers a better compatibility with WSGI middleware and applications thanks to the integration with :class:`webob.Request`. `WebOb `_ is another offers pythonic APIs to WSGI requests (the so-called "WSGI environment") and responses -- much like :class:`~django.http.HttpRequest` and :class:`~django.http.HttpResponse`, but better: - Django copies some values from the environment into its own request object, on every request, no matter if you are going to use them or not. - When you edit a WebOb request, no matter what you do, your changes will be applied in the actual WSGI environment. This is key to interoperability. - WebOb covers the environment comprehensively, with getters and other methods to make it easier and more fun to handle. - Django refuses to read POST requests if the ``CONTENT_LENGTH`` equals ``"-1"`` (may happen when read by WSGI middleware), while the intended behaviour is to **force** wrappers to read it. Instances of :class:`our request ` make an the equivalent WebOb request available as an attribute, so that you can use WebOb's accessors in your code. For example:: def my_view(request): if 'MSIE' in request.webob.user_agent: response = HttpResponseNotFound() else: response = HttpResponse() return response This request class will be used instead of the built-in one when you configure Django to use our "handler" in your ``settings.py``:: WSGI_APPLICATION = 'django_wsgi.handler.APPLICATION' See the `documentation for webob.Request `_ to learn more about the new features you now have at your disposal. Using the WSGI application directly ----------------------------------- You can import it as you would normally do in Django:: from os import environ environ['DJANGO_SETTINGS_MODULE'] = "yourpackage.settings" from django_wsgi.handler import DjangoApplication