Django

Code

Changeset 298

Show
Ignore:
Timestamp:
07/22/05 13:34:38 (3 years ago)
Author:
adrian
Message:

Fixed #63 -- Refactored django.core.handlers into subclasses to remove duplicate code

Files:

Legend:

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

    r241 r298  
     1from django.core.handlers.base import BaseHandler 
    12from django.utils import datastructures, httpwrappers 
    23from pprint import pformat 
     
    125126    user = property(_get_user, _set_user) 
    126127 
    127 class ModPythonHandler: 
    128     def __init__(self): 
    129         self._request_middleware = self._view_middleware = self._response_middleware = None 
    130  
     128class ModPythonHandler(BaseHandler): 
    131129    def __call__(self, req): 
    132130        # mod_python fakes the environ, and thus doesn't process SetEnv.  This fixes that 
     
    156154        return 0 # mod_python.apache.OK 
    157155 
    158     def load_middleware(self): 
    159         """ 
    160         Populate middleware lists from settings.MIDDLEWARE_CLASSES. 
    161  
    162         Must be called after the environment is fixed (see __call__). 
    163         """ 
    164         from django.conf import settings 
    165         from django.core import exceptions 
    166         self._request_middleware = [] 
    167         self._view_middleware = [] 
    168         self._response_middleware = [] 
    169         for middleware_path in settings.MIDDLEWARE_CLASSES: 
    170             dot = middleware_path.rindex('.') 
    171             mw_module, mw_classname = middleware_path[:dot], middleware_path[dot+1:] 
    172             try: 
    173                 mod = __import__(mw_module, '', '', ['']) 
    174             except ImportError, e: 
    175                 raise exceptions.ImproperlyConfigured, 'Error importing middleware %s: "%s"' % (mw_module, e) 
    176             try: 
    177                 mw_class = getattr(mod, mw_classname) 
    178             except AttributeError: 
    179                 raise exceptions.ImproperlyConfigured, 'Middleware module "%s" does not define a "%s" class' % (mw_module, mw_classname) 
    180  
    181             try: 
    182                 mw_instance = mw_class() 
    183             except exceptions.MiddlewareNotUsed: 
    184                 continue 
    185  
    186             if hasattr(mw_instance, 'process_request'): 
    187                 self._request_middleware.append(mw_instance.process_request) 
    188             if hasattr(mw_instance, 'process_view'): 
    189                 self._view_middleware.append(mw_instance.process_view) 
    190             if hasattr(mw_instance, 'process_response'): 
    191                 self._response_middleware.insert(0, mw_instance.process_response) 
    192  
    193     def get_response(self, path, request): 
    194         "Returns an HttpResponse object for the given HttpRequest" 
    195         from django.core import db, exceptions, urlresolvers 
    196         from django.core.mail import mail_admins 
    197         from django.conf.settings import DEBUG, INTERNAL_IPS, ROOT_URLCONF 
    198  
    199         # Apply request middleware 
    200         for middleware_method in self._request_middleware: 
    201             response = middleware_method(request) 
    202             if response: 
    203                 return response 
    204  
    205         conf_module = __import__(ROOT_URLCONF, '', '', ['']) 
    206         resolver = urlresolvers.RegexURLResolver(conf_module.urlpatterns) 
    207         try: 
    208             callback, param_dict = resolver.resolve(path) 
    209             # Apply view middleware 
    210             for middleware_method in self._view_middleware: 
    211                 response = middleware_method(request, callback, param_dict) 
    212                 if response: 
    213                     return response 
    214             return callback(request, **param_dict) 
    215         except exceptions.Http404: 
    216             if DEBUG: 
    217                 return self.get_technical_error_response(is404=True) 
    218             else: 
    219                 resolver = urlresolvers.Error404Resolver(conf_module.handler404) 
    220                 callback, param_dict = resolver.resolve() 
    221                 return callback(request, **param_dict) 
    222         except db.DatabaseError: 
    223             db.db.rollback() 
    224             if DEBUG: 
    225                 return self.get_technical_error_response() 
    226             else: 
    227                 subject = 'Database error (%s IP)' % (request.META['REMOTE_ADDR'] in INTERNAL_IPS and 'internal' or 'EXTERNAL') 
    228                 message = "%s\n\n%s" % (self._get_traceback(), request) 
    229                 mail_admins(subject, message, fail_silently=True) 
    230                 return self.get_friendly_error_response(request, conf_module) 
    231         except exceptions.PermissionDenied: 
    232             return httpwrappers.HttpResponseForbidden('<h1>Permission denied</h1>') 
    233         except: # Handle everything else, including SuspiciousOperation, etc. 
    234             if DEBUG: 
    235                 return self.get_technical_error_response() 
    236             else: 
    237                 subject = 'Coding error (%s IP)' % (request.META['REMOTE_ADDR'] in INTERNAL_IPS and 'internal' or 'EXTERNAL') 
    238                 try: 
    239                     request_repr = repr(request) 
    240                 except: 
    241                     request_repr = "Request repr() unavailable" 
    242                 message = "%s\n\n%s" % (self._get_traceback(), request_repr) 
    243                 mail_admins(subject, message, fail_silently=True) 
    244                 return self.get_friendly_error_response(request, conf_module) 
    245  
    246     def get_friendly_error_response(self, request, conf_module): 
    247         """ 
    248         Returns an HttpResponse that displays a PUBLIC error message for a 
    249         fundamental database or coding error. 
    250         """ 
    251         from django.core import urlresolvers 
    252         resolver = urlresolvers.Error404Resolver(conf_module.handler500) 
    253         callback, param_dict = resolver.resolve() 
    254         return callback(request, **param_dict) 
    255  
    256     def get_technical_error_response(self, is404=False): 
    257         """ 
    258         Returns an HttpResponse that displays a TECHNICAL error message for a 
    259         fundamental database or coding error. 
    260         """ 
    261         error_string = "There's been an error:\n\n%s" % self._get_traceback() 
    262         responseClass = is404 and httpwrappers.HttpResponseNotFound or httpwrappers.HttpResponseServerError 
    263         return responseClass(error_string, mimetype='text/plain') 
    264  
    265     def _get_traceback(self): 
    266         "Helper function to return the traceback as a string" 
    267         import sys, traceback 
    268         return '\n'.join(traceback.format_exception(*sys.exc_info())) 
    269  
    270156def populate_apache_request(http_response, mod_python_req): 
    271157    "Populates the mod_python request object with an HttpResponse" 
  • django/trunk/django/core/handlers/wsgi.py

    r297 r298  
     1from django.core.handlers.base import BaseHandler 
    12from django.utils import datastructures, httpwrappers 
    23from pprint import pformat 
     
    105106    user = property(_get_user, _set_user) 
    106107 
    107 class WSGIHandler: 
    108     def __init__(self): 
    109         self._request_middleware = self._view_middleware = self._response_middleware = None 
    110  
     108class WSGIHandler(BaseHandler): 
    111109    def __call__(self, environ, start_response): 
    112110        from django.conf import settings 
     
    139137        start_response(status, response_headers.items()) 
    140138        return output 
    141  
    142     def load_middleware(self): 
    143         """ 
    144         Populate middleware lists from settings.MIDDLEWARE_CLASSES. 
    145  
    146         Must be called after the environment is fixed (see __call__). 
    147         """ 
    148         from django.conf import settings 
    149         from django.core import exceptions 
    150         self._request_middleware = [] 
    151         self._view_middleware = [] 
    152         self._response_middleware = [] 
    153         for middleware_path in settings.MIDDLEWARE_CLASSES: 
    154             dot = middleware_path.rindex('.') 
    155             mw_module, mw_classname = middleware_path[:dot], middleware_path[dot+1:] 
    156             try: 
    157                 mod = __import__(mw_module, '', '', ['']) 
    158             except ImportError, e: 
    159                 raise exceptions.ImproperlyConfigured, \ 
    160                     'Error importing middleware %s: "%s"' % (mw_module, e) 
    161             try: 
    162                 mw_class = getattr(mod, mw_classname) 
    163             except AttributeError: 
    164                 raise exceptions.ImproperlyConfigured, \ 
    165                     'Middleware module "%s" does not define a "%s" class' % (mw_module, mw_classname) 
    166  
    167             try: 
    168                 mw_instance = mw_class() 
    169             except exceptions.MiddlewareNotUsed: 
    170                 continue 
    171  
    172             if hasattr(mw_instance, 'process_request'): 
    173                 self._request_middleware.append(mw_instance.process_request) 
    174             if hasattr(mw_instance, 'process_view'): 
    175                 self._view_middleware.append(mw_instance.process_view) 
    176             if hasattr(mw_instance, 'process_response'): 
    177                 self._response_middleware.insert(0, mw_instance.process_response) 
    178  
    179     def get_response(self, path, request): 
    180         "Returns an HttpResponse object for the given HttpRequest" 
    181         from django.core import db, exceptions, urlresolvers 
    182         from django.core.mail import mail_admins 
    183         from django.conf.settings import DEBUG, INTERNAL_IPS, ROOT_URLCONF 
    184  
    185         # Apply request middleware 
    186         for middleware_method in self._request_middleware: 
    187             response = middleware_method(request) 
    188             if response: 
    189                 return response 
    190  
    191         conf_module = __import__(ROOT_URLCONF, '', '', ['']) 
    192         resolver = urlresolvers.RegexURLResolver(conf_module.urlpatterns) 
    193         try: 
    194             callback, param_dict = resolver.resolve(path) 
    195             # Apply view middleware 
    196             for middleware_method in self._view_middleware: 
    197                 response = middleware_method(request, callback, param_dict) 
    198                 if response: 
    199                     return response 
    200             return callback(request, **param_dict) 
    201         except exceptions.Http404: 
    202             if DEBUG: 
    203                 return self.get_technical_error_response(is404=True) 
    204             else: 
    205                 resolver = urlresolvers.Error404Resolver(conf_module.handler404) 
    206                 callback, param_dict = resolver.resolve() 
    207                 return callback(request, **param_dict) 
    208         except db.DatabaseError: 
    209             db.db.rollback() 
    210             if DEBUG: 
    211                 return self.get_technical_error_response() 
    212             else: 
    213                 subject = 'Database error (%s IP)' % \ 
    214                     (request.META['REMOTE_ADDR'] in INTERNAL_IPS and 'internal' or 'EXTERNAL') 
    215                 message = "%s\n\n%s" % (self._get_traceback(), request) 
    216                 mail_admins(subject, message, fail_silently=True) 
    217                 return self.get_friendly_error_response(request, conf_module) 
    218         except exceptions.PermissionDenied: 
    219             return httpwrappers.HttpResponseForbidden('<h1>Permission denied</h1>') 
    220         except: # Handle everything else, including SuspiciousOperation, etc. 
    221             if DEBUG: 
    222                 return self.get_technical_error_response() 
    223             else: 
    224                 subject = 'Coding error (%s IP)' % \ 
    225                     (request.META['REMOTE_ADDR'] in INTERNAL_IPS and 'internal' or 'EXTERNAL') 
    226                 message = "%s\n\n%s" % (self._get_traceback(), request) 
    227                 mail_admins(subject, message, fail_silently=True) 
    228                 return self.get_friendly_error_response(request, conf_module) 
    229  
    230     def get_friendly_error_response(self, request, conf_module): 
    231         """ 
    232         Returns an HttpResponse that displays a PUBLIC error message for a 
    233         fundamental database or coding error. 
    234         """ 
    235         from django.core import urlresolvers 
    236         resolver = urlresolvers.Error404Resolver(conf_module.handler500) 
    237         callback, param_dict = resolver.resolve() 
    238         return callback(request, **param_dict) 
    239  
    240     def get_technical_error_response(self, is404=False): 
    241         """ 
    242         Returns an HttpResponse that displays a TECHNICAL error message for a 
    243         fundamental database or coding error. 
    244         """ 
    245         error_string = "There's been an error:\n\n%s" % self._get_traceback() 
    246         responseClass = is404 and httpwrappers.HttpResponseNotFound or httpwrappers.HttpResponseServerError 
    247         return responseClass(error_string, mimetype='text/plain') 
    248  
    249     def _get_traceback(self): 
    250         "Helper function to return the traceback as a string" 
    251         import sys, traceback 
    252         return '\n'.join(traceback.format_exception(*sys.exc_info())) 
    253139 
    254140class AdminMediaHandler: