1
0
mirror of https://github.com/django/django.git synced 2025-06-11 06:29:13 +00:00

magic-removal: Django no longer requires a database. Moved database-handling stuff in django handlers to use dispatching

git-svn-id: http://code.djangoproject.com/svn/django/branches/magic-removal@1807 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Adrian Holovaty 2005-12-31 00:08:49 +00:00
parent 76bc09a09a
commit 029efcd089
5 changed files with 34 additions and 20 deletions

View File

@ -1,3 +1,5 @@
from django.core import signals
from django.dispatch import dispatcher
from django.utils import httpwrappers from django.utils import httpwrappers
class BaseHandler: class BaseHandler:
@ -48,13 +50,9 @@ class BaseHandler:
def get_response(self, path, request): def get_response(self, path, request):
"Returns an HttpResponse object for the given HttpRequest" "Returns an HttpResponse object for the given HttpRequest"
from django.core import exceptions, urlresolvers from django.core import exceptions, urlresolvers
from django.db import connection, DatabaseError
from django.core.mail import mail_admins from django.core.mail import mail_admins
from django.conf.settings import DEBUG, INTERNAL_IPS, ROOT_URLCONF from django.conf.settings import DEBUG, INTERNAL_IPS, ROOT_URLCONF
# Reset query list per request.
connection.queries = []
# Apply request middleware # Apply request middleware
for middleware_method in self._request_middleware: for middleware_method in self._request_middleware:
response = middleware_method(request) response = middleware_method(request)
@ -94,22 +92,15 @@ class BaseHandler:
else: else:
callback, param_dict = resolver.resolve404() callback, param_dict = resolver.resolve404()
return callback(request, **param_dict) return callback(request, **param_dict)
except DatabaseError:
connection.rollback()
if DEBUG:
return self.get_technical_error_response(request)
else:
subject = 'Database error (%s IP): %s' % ((request.META.get('REMOTE_ADDR') in INTERNAL_IPS and 'internal' or 'EXTERNAL'), getattr(request, 'path', ''))
message = "%s\n\n%s" % (self._get_traceback(), request)
mail_admins(subject, message, fail_silently=True)
return self.get_friendly_error_response(request, resolver)
except exceptions.PermissionDenied: except exceptions.PermissionDenied:
return httpwrappers.HttpResponseForbidden('<h1>Permission denied</h1>') return httpwrappers.HttpResponseForbidden('<h1>Permission denied</h1>')
except: # Handle everything else, including SuspiciousOperation, etc. except: # Handle everything else, including SuspiciousOperation, etc.
if DEBUG: if DEBUG:
return self.get_technical_error_response(request) return self.get_technical_error_response(request)
else: else:
subject = 'Coding error (%s IP): %s' % ((request.META.get('REMOTE_ADDR') in INTERNAL_IPS and 'internal' or 'EXTERNAL'), getattr(request, 'path', '')) receivers = dispatcher.send(signal=signals.got_request_exception)
# When DEBUG is False, send an error message to the admins.
subject = 'Error (%s IP): %s' % ((request.META.get('REMOTE_ADDR') in INTERNAL_IPS and 'internal' or 'EXTERNAL'), getattr(request, 'path', ''))
try: try:
request_repr = repr(request) request_repr = repr(request)
except: except:
@ -121,7 +112,7 @@ class BaseHandler:
def get_friendly_error_response(self, request, resolver): def get_friendly_error_response(self, request, resolver):
""" """
Returns an HttpResponse that displays a PUBLIC error message for a Returns an HttpResponse that displays a PUBLIC error message for a
fundamental database or coding error. fundamental error.
""" """
from django.core import urlresolvers from django.core import urlresolvers
callback, param_dict = resolver.resolve500() callback, param_dict = resolver.resolve500()
@ -130,7 +121,7 @@ class BaseHandler:
def get_technical_error_response(self, request, is404=False, exception=None): def get_technical_error_response(self, request, is404=False, exception=None):
""" """
Returns an HttpResponse that displays a TECHNICAL error message for a Returns an HttpResponse that displays a TECHNICAL error message for a
fundamental database or coding error. fundamental error.
""" """
import sys import sys
from django.views import debug from django.views import debug

View File

@ -1,4 +1,6 @@
from django.core.handlers.base import BaseHandler from django.core.handlers.base import BaseHandler
from django.core import signals
from django.dispatch import dispatcher
from django.utils import datastructures, httpwrappers from django.utils import datastructures, httpwrappers
from pprint import pformat from pprint import pformat
import os import os
@ -128,17 +130,17 @@ class ModPythonHandler(BaseHandler):
# now that the environ works we can see the correct settings, so imports # now that the environ works we can see the correct settings, so imports
# that use settings now can work # that use settings now can work
from django.conf import settings from django.conf import settings
from django.db import connection
# if we need to set up middleware, now that settings works we can do it now. # if we need to set up middleware, now that settings works we can do it now.
if self._request_middleware is None: if self._request_middleware is None:
self.load_middleware() self.load_middleware()
dispatcher.send(signal=signals.request_started)
try: try:
request = ModPythonRequest(req) request = ModPythonRequest(req)
response = self.get_response(req.uri, request) response = self.get_response(req.uri, request)
finally: finally:
connection.close() dispatcher.send(signal=signals.request_finished)
# Apply response middleware # Apply response middleware
for middleware_method in self._response_middleware: for middleware_method in self._response_middleware:

View File

@ -1,4 +1,6 @@
from django.core.handlers.base import BaseHandler from django.core.handlers.base import BaseHandler
from django.core import signals
from django.dispatch import dispatcher
from django.utils import datastructures, httpwrappers from django.utils import datastructures, httpwrappers
from pprint import pformat from pprint import pformat
@ -143,18 +145,18 @@ class WSGIRequest(httpwrappers.HttpRequest):
class WSGIHandler(BaseHandler): class WSGIHandler(BaseHandler):
def __call__(self, environ, start_response): def __call__(self, environ, start_response):
from django.conf import settings from django.conf import settings
from django.db import connection
# Set up middleware if needed. We couldn't do this earlier, because # Set up middleware if needed. We couldn't do this earlier, because
# settings weren't available. # settings weren't available.
if self._request_middleware is None: if self._request_middleware is None:
self.load_middleware() self.load_middleware()
dispatcher.send(signal=signals.request_started)
try: try:
request = WSGIRequest(environ) request = WSGIRequest(environ)
response = self.get_response(request.path, request) response = self.get_response(request.path, request)
finally: finally:
connection.close() dispatcher.send(signal=signals.request_finished)
# Apply response middleware # Apply response middleware
for middleware_method in self._response_middleware: for middleware_method in self._response_middleware:

3
django/core/signals.py Normal file
View File

@ -0,0 +1,3 @@
request_started = object()
request_finished = object()
got_request_exception = object()

View File

@ -1,4 +1,6 @@
from django.conf.settings import DATABASE_ENGINE from django.conf.settings import DATABASE_ENGINE
from django.core import signals
from django.dispatch import dispatcher
__all__ = ('backend', 'connection', 'DatabaseError') __all__ = ('backend', 'connection', 'DatabaseError')
@ -23,3 +25,17 @@ get_creation_module = lambda: __import__('django.db.backends.%s.creation' % DATA
connection = backend.DatabaseWrapper() connection = backend.DatabaseWrapper()
DatabaseError = backend.DatabaseError DatabaseError = backend.DatabaseError
# Register an event that closes the database connection
# when a Django request is finished.
dispatcher.connect(lambda: connection.close(), signal=signals.request_finished)
# Register an event that resets connection.queries
# when a Django request is started.
def reset_queries():
connection.queries = []
dispatcher.connect(reset_queries, signal=signals.request_started)
# Register an event that rolls back the connection
# when a Django request has an exception.
dispatcher.connect(lambda: connection.rollback(), signal=signals.got_request_exception)