Django

Code

Changeset 880

Show
Ignore:
Timestamp:
10/14/05 21:20:35 (3 years ago)
Author:
adrian
Message:

Fixed #616 -- Added a process_exception() hook to middleware framework. Thanks, Hugo

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/core/handlers/base.py

    r580 r880  
    33class BaseHandler: 
    44    def __init__(self): 
    5         self._request_middleware = self._view_middleware = self._response_middleware = None 
     5        self._request_middleware = self._view_middleware = self._response_middleware = self._exception_middleware = None 
    66 
    77    def load_middleware(self): 
     
    1616        self._view_middleware = [] 
    1717        self._response_middleware = [] 
     18        self._exception_middleware = [] 
    1819        for middleware_path in settings.MIDDLEWARE_CLASSES: 
    1920            dot = middleware_path.rindex('.') 
     
    3940            if hasattr(mw_instance, 'process_response'): 
    4041                self._response_middleware.insert(0, mw_instance.process_response) 
     42            if hasattr(mw_instance, 'process_exception'): 
     43                self._exception_middleware.insert(0, mw_instance.process_exception) 
    4144 
    4245    def get_response(self, path, request): 
     
    6265                    return response 
    6366 
    64             response = callback(request, **param_dict) 
     67            try: 
     68                response = callback(request, **param_dict) 
     69            except Exception, e: 
     70                # If the view raised an exception, run it through exception 
     71                # middleware, and if the exception middleware returns a 
     72                # response, use that. Otherwise, reraise the exception. 
     73                for middleware_method in self._exception_middleware: 
     74                    response = middleware_method(request, e) 
     75                    if response: 
     76                        return response 
     77                raise e 
    6578 
    6679            # Complain if the view returned None (a common error). 
  • django/trunk/django/utils/decorators.py

    r820 r880  
    1717                if result is not None: 
    1818                    return result 
    19             response = view_func(request, *args, **kwargs) 
     19            try: 
     20                response = view_func(request, *args, **kwargs) 
     21            except Exception, e: 
     22                if hasattr(middleware, 'process_exception'): 
     23                    result = middleware.process_exception(request, e) 
     24                    if result is not None: 
     25                        return result 
     26                raise e 
    2027            if hasattr(middleware, 'process_response'): 
    2128                result = middleware.process_response(request, response) 
  • django/trunk/docs/middleware.txt

    r814 r880  
    169169``HttpResponse``. 
    170170 
     171process_exception 
     172----------------- 
     173 
     174Interface: ``process_exception(self, request, exception)`` 
     175 
     176``request`` is an ``HttpRequest`` object. ``exception`` is an ``Exception`` 
     177object raised by the view function. 
     178 
     179Django calls ``process_exception()`` when a view raises an exception. 
     180``process_exception()`` should return either ``None`` or an ``HttpResponse`` 
     181object. If it returns an ``HttpResponse`` object, the response will be returned 
     182to the browser. Otherwise, default exception handling kicks in. 
     183 
    171184Guidelines 
    172185----------