Changeset 298
- Timestamp:
- 07/22/05 13:34:38 (3 years ago)
- Files:
-
- django/trunk/django/core/handlers/base.py (added)
- django/trunk/django/core/handlers/modpython.py (modified) (3 diffs)
- django/trunk/django/core/handlers/wsgi.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/trunk/django/core/handlers/modpython.py
r241 r298 1 from django.core.handlers.base import BaseHandler 1 2 from django.utils import datastructures, httpwrappers 2 3 from pprint import pformat … … 125 126 user = property(_get_user, _set_user) 126 127 127 class ModPythonHandler: 128 def __init__(self): 129 self._request_middleware = self._view_middleware = self._response_middleware = None 130 128 class ModPythonHandler(BaseHandler): 131 129 def __call__(self, req): 132 130 # mod_python fakes the environ, and thus doesn't process SetEnv. This fixes that … … 156 154 return 0 # mod_python.apache.OK 157 155 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 settings165 from django.core import exceptions166 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 continue185 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, urlresolvers196 from django.core.mail import mail_admins197 from django.conf.settings import DEBUG, INTERNAL_IPS, ROOT_URLCONF198 199 # Apply request middleware200 for middleware_method in self._request_middleware:201 response = middleware_method(request)202 if response:203 return response204 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 middleware210 for middleware_method in self._view_middleware:211 response = middleware_method(request, callback, param_dict)212 if response:213 return response214 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 a249 fundamental database or coding error.250 """251 from django.core import urlresolvers252 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 a259 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.HttpResponseServerError263 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, traceback268 return '\n'.join(traceback.format_exception(*sys.exc_info()))269 270 156 def populate_apache_request(http_response, mod_python_req): 271 157 "Populates the mod_python request object with an HttpResponse" django/trunk/django/core/handlers/wsgi.py
r297 r298 1 from django.core.handlers.base import BaseHandler 1 2 from django.utils import datastructures, httpwrappers 2 3 from pprint import pformat … … 105 106 user = property(_get_user, _set_user) 106 107 107 class WSGIHandler: 108 def __init__(self): 109 self._request_middleware = self._view_middleware = self._response_middleware = None 110 108 class WSGIHandler(BaseHandler): 111 109 def __call__(self, environ, start_response): 112 110 from django.conf import settings … … 139 137 start_response(status, response_headers.items()) 140 138 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 settings149 from django.core import exceptions150 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 continue171 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, urlresolvers182 from django.core.mail import mail_admins183 from django.conf.settings import DEBUG, INTERNAL_IPS, ROOT_URLCONF184 185 # Apply request middleware186 for middleware_method in self._request_middleware:187 response = middleware_method(request)188 if response:189 return response190 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 middleware196 for middleware_method in self._view_middleware:197 response = middleware_method(request, callback, param_dict)198 if response:199 return response200 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 a233 fundamental database or coding error.234 """235 from django.core import urlresolvers236 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 a243 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.HttpResponseServerError247 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, traceback252 return '\n'.join(traceback.format_exception(*sys.exc_info()))253 139 254 140 class AdminMediaHandler:
