Index: django/core/handlers/base.py
===================================================================
--- django/core/handlers/base.py	(revision 8219)
+++ django/core/handlers/base.py	(working copy)
@@ -29,7 +29,11 @@
         self._view_middleware = []
         self._response_middleware = []
         self._exception_middleware = []
-        for middleware_path in settings.MIDDLEWARE_CLASSES:
+        # (middleware_path, weight) tuples in MIDDLEWARE_CLASSES
+        # heavier items processed first
+        middleware_list = []
+        for middleware in settings.MIDDLEWARE_CLASSES:
+            middleware_path = middleware[0]
             try:
                 dot = middleware_path.rindex('.')
             except ValueError:
@@ -48,16 +52,24 @@
                 mw_instance = mw_class()
             except exceptions.MiddlewareNotUsed:
                 continue
+            middleware_list.append((middleware[1], mw_instance))
 
-            if hasattr(mw_instance, 'process_request'):
+        # inbound
+        for middleware in middleware_list:
+            if hasattr(middleware[1], 'process_request'):
                 self._request_middleware.append(mw_instance.process_request)
-            if hasattr(mw_instance, 'process_view'):
+            if hasattr(middleware[1], 'process_view'):
                 self._view_middleware.append(mw_instance.process_view)
-            if hasattr(mw_instance, 'process_response'):
-                self._response_middleware.insert(0, mw_instance.process_response)
-            if hasattr(mw_instance, 'process_exception'):
-                self._exception_middleware.insert(0, mw_instance.process_exception)
 
+        # outbound
+        middleware_list.sort()
+        middleware_list.reverse() # remove if lighter items first
+        for middleware in middleware_list:
+            if hasattr(middleware[1], 'process_response'):
+                self._response_middleware.append(0, mw_instance.process_response)
+            if hasattr(middleware[1], 'process_exception'):
+                self._exception_middleware.append(0, mw_instance.process_exception)
+
     def get_response(self, request):
         "Returns an HttpResponse object for the given HttpRequest"
         from django.core import exceptions, urlresolvers
