Django notes
============
The Problem
-----------
Unfortunately, Django uses the term `middleware` incorrect. What it refers to
is, specifically, `Django middleware`. WSGI middleware, on the otherhand, is
defined by :pep:`333` and is warranted as a standard that all WSGI servers
follow.
Possible Solutions
------------------
Currently, `linesman` can *only* be run in a WSGI environment that adheres to
:pep:`333`, as mentioned above. If this is the case, you can wrap the
application call by following the instructions in :ref:`configuration_code`.
For example, the official Django docs refer to using `mod_wsgi and Apache to
host a Django app
`_. In this
case, you would wrap the :meth:`django.core.handlers.wsgi.WSGIHandler()` call
with the middleware, like so::
import os
import sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
import django.core.handlers.wsgi
from linesman.middleware import make_linesman_middleware
application = django.core.handlers.wsgi.WSGIHandler()
application = make_linesman_middleware(application)
If running a full WSGI server is a little too heavy-weight, there's a very,
very alpha release of `DjangoPaste `_,
which provides the ability to launch Django using Paste.
The final solution (not yet implemented) is to wrap the middleware so that it is usuable by the
Django middleware. This introduces two big issues. First, when implemented as
WSGI middleware, `linesman` can wrap the *whole* request, from start to finish.
With Django, the profiling will only begin when Django initializes the
middleware. Secondly, because I am not familiar with Django (yet), it may not
be possible to simply jury rig the middleware onto a request. But this may be
changed after future research.
Conclusion (tl;dr)
------------------
If your Django app is being run in a WSGI environment, you do not need to do
any additional work and can wrap the application by following the instructions
on the :ref:`getting started page `. Otherwise, there's no
convenient or easy solution for running `linesman` on Django.