mirror of
https://github.com/django/django.git
synced 2025-10-24 06:06:09 +00:00
MERGED MAGIC-REMOVAL BRANCH TO TRUNK. This change is highly backwards-incompatible. Please read http://code.djangoproject.com/wiki/RemovingTheMagic for upgrade instructions.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@2809 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
from django.utils import httpwrappers
|
||||
from django.core import signals
|
||||
from django.dispatch import dispatcher
|
||||
from django import http
|
||||
import sys
|
||||
|
||||
class BaseHandler:
|
||||
@@ -48,12 +50,9 @@ class BaseHandler:
|
||||
|
||||
def get_response(self, path, request):
|
||||
"Returns an HttpResponse object for the given HttpRequest"
|
||||
from django.core import db, exceptions, urlresolvers
|
||||
from django.core import exceptions, urlresolvers
|
||||
from django.core.mail import mail_admins
|
||||
from django.conf.settings import DEBUG, INTERNAL_IPS, ROOT_URLCONF
|
||||
|
||||
# Reset query list per request.
|
||||
db.db.queries = []
|
||||
from django.conf import settings
|
||||
|
||||
# Apply request middleware
|
||||
for middleware_method in self._request_middleware:
|
||||
@@ -61,7 +60,7 @@ class BaseHandler:
|
||||
if response:
|
||||
return response
|
||||
|
||||
resolver = urlresolvers.RegexURLResolver(r'^/', ROOT_URLCONF)
|
||||
resolver = urlresolvers.RegexURLResolver(r'^/', settings.ROOT_URLCONF)
|
||||
try:
|
||||
callback, callback_args, callback_kwargs = resolver.resolve(path)
|
||||
|
||||
@@ -88,30 +87,23 @@ class BaseHandler:
|
||||
raise ValueError, "The view %s.%s didn't return an HttpResponse object." % (callback.__module__, callback.func_name)
|
||||
|
||||
return response
|
||||
except exceptions.Http404, e:
|
||||
if DEBUG:
|
||||
except http.Http404, e:
|
||||
if settings.DEBUG:
|
||||
return self.get_technical_error_response(request, is404=True, exception=e)
|
||||
else:
|
||||
callback, param_dict = resolver.resolve404()
|
||||
return callback(request, **param_dict)
|
||||
except db.DatabaseError:
|
||||
db.db.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:
|
||||
return httpwrappers.HttpResponseForbidden('<h1>Permission denied</h1>')
|
||||
return http.HttpResponseForbidden('<h1>Permission denied</h1>')
|
||||
except: # Handle everything else, including SuspiciousOperation, etc.
|
||||
if DEBUG:
|
||||
if settings.DEBUG:
|
||||
return self.get_technical_error_response(request)
|
||||
else:
|
||||
# Get the exception info now, in case another exception is thrown later.
|
||||
exc_info = sys.exc_info()
|
||||
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 settings.INTERNAL_IPS and 'internal' or 'EXTERNAL'), getattr(request, 'path', ''))
|
||||
try:
|
||||
request_repr = repr(request)
|
||||
except:
|
||||
@@ -123,7 +115,7 @@ class BaseHandler:
|
||||
def get_friendly_error_response(self, request, resolver):
|
||||
"""
|
||||
Returns an HttpResponse that displays a PUBLIC error message for a
|
||||
fundamental database or coding error.
|
||||
fundamental error.
|
||||
"""
|
||||
from django.core import urlresolvers
|
||||
callback, param_dict = resolver.resolve500()
|
||||
@@ -132,7 +124,7 @@ class BaseHandler:
|
||||
def get_technical_error_response(self, request, is404=False, exception=None):
|
||||
"""
|
||||
Returns an HttpResponse that displays a TECHNICAL error message for a
|
||||
fundamental database or coding error.
|
||||
fundamental error.
|
||||
"""
|
||||
from django.views import debug
|
||||
if is404:
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
from django.core.handlers.base import BaseHandler
|
||||
from django.utils import datastructures, httpwrappers
|
||||
from django.core import signals
|
||||
from django.dispatch import dispatcher
|
||||
from django.utils import datastructures
|
||||
from django import http
|
||||
from pprint import pformat
|
||||
import os
|
||||
|
||||
@@ -7,15 +10,15 @@ import os
|
||||
# settings) until after ModPythonHandler has been called; otherwise os.environ
|
||||
# won't be set up correctly (with respect to settings).
|
||||
|
||||
class ModPythonRequest(httpwrappers.HttpRequest):
|
||||
class ModPythonRequest(http.HttpRequest):
|
||||
def __init__(self, req):
|
||||
self._req = req
|
||||
self.path = req.uri
|
||||
|
||||
def __repr__(self):
|
||||
return '<ModPythonRequest\npath:%s,\nGET:%s,\nPOST:%s,\nCOOKIES:%s,\nMETA:%s,\nuser:%s>' % \
|
||||
return '<ModPythonRequest\npath:%s,\nGET:%s,\nPOST:%s,\nCOOKIES:%s,\nMETA:%s>' % \
|
||||
(self.path, pformat(self.GET), pformat(self.POST), pformat(self.COOKIES),
|
||||
pformat(self.META), pformat(self.user))
|
||||
pformat(self.META))
|
||||
|
||||
def get_full_path(self):
|
||||
return '%s%s' % (self.path, self._req.args and ('?' + self._req.args) or '')
|
||||
@@ -23,18 +26,18 @@ class ModPythonRequest(httpwrappers.HttpRequest):
|
||||
def _load_post_and_files(self):
|
||||
"Populates self._post and self._files"
|
||||
if self._req.headers_in.has_key('content-type') and self._req.headers_in['content-type'].startswith('multipart'):
|
||||
self._post, self._files = httpwrappers.parse_file_upload(self._req.headers_in, self.raw_post_data)
|
||||
self._post, self._files = http.parse_file_upload(self._req.headers_in, self.raw_post_data)
|
||||
else:
|
||||
self._post, self._files = httpwrappers.QueryDict(self.raw_post_data), datastructures.MultiValueDict()
|
||||
self._post, self._files = http.QueryDict(self.raw_post_data), datastructures.MultiValueDict()
|
||||
|
||||
def _get_request(self):
|
||||
if not hasattr(self, '_request'):
|
||||
self._request = datastructures.MergeDict(self.POST, self.GET)
|
||||
self._request = datastructures.MergeDict(self.POST, self.GET)
|
||||
return self._request
|
||||
|
||||
def _get_get(self):
|
||||
if not hasattr(self, '_get'):
|
||||
self._get = httpwrappers.QueryDict(self._req.args)
|
||||
self._get = http.QueryDict(self._req.args)
|
||||
return self._get
|
||||
|
||||
def _set_get(self, get):
|
||||
@@ -50,7 +53,7 @@ class ModPythonRequest(httpwrappers.HttpRequest):
|
||||
|
||||
def _get_cookies(self):
|
||||
if not hasattr(self, '_cookies'):
|
||||
self._cookies = httpwrappers.parse_cookie(self._req.headers_in.get('cookie', ''))
|
||||
self._cookies = http.parse_cookie(self._req.headers_in.get('cookie', ''))
|
||||
return self._cookies
|
||||
|
||||
def _set_cookies(self, cookies):
|
||||
@@ -95,22 +98,6 @@ class ModPythonRequest(httpwrappers.HttpRequest):
|
||||
self._raw_post_data = self._req.read()
|
||||
return self._raw_post_data
|
||||
|
||||
def _get_user(self):
|
||||
if not hasattr(self, '_user'):
|
||||
from django.models.auth import users
|
||||
try:
|
||||
user_id = self.session[users.SESSION_KEY]
|
||||
if not user_id:
|
||||
raise ValueError
|
||||
self._user = users.get_object(pk=user_id)
|
||||
except (AttributeError, KeyError, ValueError, users.UserDoesNotExist):
|
||||
from django.parts.auth import anonymoususers
|
||||
self._user = anonymoususers.AnonymousUser()
|
||||
return self._user
|
||||
|
||||
def _set_user(self, user):
|
||||
self._user = user
|
||||
|
||||
GET = property(_get_get, _set_get)
|
||||
POST = property(_get_post, _set_post)
|
||||
COOKIES = property(_get_cookies, _set_cookies)
|
||||
@@ -118,7 +105,6 @@ class ModPythonRequest(httpwrappers.HttpRequest):
|
||||
META = property(_get_meta)
|
||||
REQUEST = property(_get_request)
|
||||
raw_post_data = property(_get_raw_post_data)
|
||||
user = property(_get_user, _set_user)
|
||||
|
||||
class ModPythonHandler(BaseHandler):
|
||||
def __call__(self, req):
|
||||
@@ -128,7 +114,6 @@ class ModPythonHandler(BaseHandler):
|
||||
# now that the environ works we can see the correct settings, so imports
|
||||
# that use settings now can work
|
||||
from django.conf import settings
|
||||
from django.core import db
|
||||
|
||||
if settings.ENABLE_PSYCO:
|
||||
import psyco
|
||||
@@ -138,15 +123,17 @@ class ModPythonHandler(BaseHandler):
|
||||
if self._request_middleware is None:
|
||||
self.load_middleware()
|
||||
|
||||
dispatcher.send(signal=signals.request_started)
|
||||
try:
|
||||
request = ModPythonRequest(req)
|
||||
response = self.get_response(req.uri, request)
|
||||
finally:
|
||||
db.db.close()
|
||||
|
||||
# Apply response middleware
|
||||
for middleware_method in self._response_middleware:
|
||||
response = middleware_method(request, response)
|
||||
# Apply response middleware
|
||||
for middleware_method in self._response_middleware:
|
||||
response = middleware_method(request, response)
|
||||
|
||||
finally:
|
||||
dispatcher.send(signal=signals.request_finished)
|
||||
|
||||
# Convert our custom HttpResponse object back into the mod_python req.
|
||||
populate_apache_request(response, req)
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
from django.core.handlers.base import BaseHandler
|
||||
from django.utils import datastructures, httpwrappers
|
||||
from django.core import signals
|
||||
from django.dispatch import dispatcher
|
||||
from django.utils import datastructures
|
||||
from django import http
|
||||
from pprint import pformat
|
||||
|
||||
# See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
|
||||
@@ -47,7 +50,7 @@ STATUS_CODE_TEXT = {
|
||||
505: 'HTTP VERSION NOT SUPPORTED',
|
||||
}
|
||||
|
||||
class WSGIRequest(httpwrappers.HttpRequest):
|
||||
class WSGIRequest(http.HttpRequest):
|
||||
def __init__(self, environ):
|
||||
self.environ = environ
|
||||
self.path = environ['PATH_INFO']
|
||||
@@ -60,7 +63,7 @@ class WSGIRequest(httpwrappers.HttpRequest):
|
||||
pformat(self.META))
|
||||
|
||||
def get_full_path(self):
|
||||
return '%s%s' % (self.path, self.environ['QUERY_STRING'] and ('?' + self.environ['QUERY_STRING']) or '')
|
||||
return '%s%s' % (self.path, self.environ.get('QUERY_STRING', '') and ('?' + self.environ.get('QUERY_STRING', '')) or '')
|
||||
|
||||
def _load_post_and_files(self):
|
||||
# Populates self._post and self._files
|
||||
@@ -68,21 +71,21 @@ class WSGIRequest(httpwrappers.HttpRequest):
|
||||
if self.environ.get('CONTENT_TYPE', '').startswith('multipart'):
|
||||
header_dict = dict([(k, v) for k, v in self.environ.items() if k.startswith('HTTP_')])
|
||||
header_dict['Content-Type'] = self.environ.get('CONTENT_TYPE', '')
|
||||
self._post, self._files = httpwrappers.parse_file_upload(header_dict, self.raw_post_data)
|
||||
self._post, self._files = http.parse_file_upload(header_dict, self.raw_post_data)
|
||||
else:
|
||||
self._post, self._files = httpwrappers.QueryDict(self.raw_post_data), datastructures.MultiValueDict()
|
||||
self._post, self._files = http.QueryDict(self.raw_post_data), datastructures.MultiValueDict()
|
||||
else:
|
||||
self._post, self._files = httpwrappers.QueryDict(''), datastructures.MultiValueDict()
|
||||
self._post, self._files = http.QueryDict(''), datastructures.MultiValueDict()
|
||||
|
||||
def _get_request(self):
|
||||
if not hasattr(self, '_request'):
|
||||
self._request = datastructures.MergeDict(self.POST, self.GET)
|
||||
self._request = datastructures.MergeDict(self.POST, self.GET)
|
||||
return self._request
|
||||
|
||||
def _get_get(self):
|
||||
if not hasattr(self, '_get'):
|
||||
# The WSGI spec says 'QUERY_STRING' may be absent.
|
||||
self._get = httpwrappers.QueryDict(self.environ.get('QUERY_STRING', ''))
|
||||
self._get = http.QueryDict(self.environ.get('QUERY_STRING', ''))
|
||||
return self._get
|
||||
|
||||
def _set_get(self, get):
|
||||
@@ -98,7 +101,7 @@ class WSGIRequest(httpwrappers.HttpRequest):
|
||||
|
||||
def _get_cookies(self):
|
||||
if not hasattr(self, '_cookies'):
|
||||
self._cookies = httpwrappers.parse_cookie(self.environ.get('HTTP_COOKIE', ''))
|
||||
self._cookies = http.parse_cookie(self.environ.get('HTTP_COOKIE', ''))
|
||||
return self._cookies
|
||||
|
||||
def _set_cookies(self, cookies):
|
||||
@@ -116,34 +119,16 @@ class WSGIRequest(httpwrappers.HttpRequest):
|
||||
self._raw_post_data = self.environ['wsgi.input'].read(int(self.environ["CONTENT_LENGTH"]))
|
||||
return self._raw_post_data
|
||||
|
||||
def _get_user(self):
|
||||
if not hasattr(self, '_user'):
|
||||
from django.models.auth import users
|
||||
try:
|
||||
user_id = self.session[users.SESSION_KEY]
|
||||
if not user_id:
|
||||
raise ValueError
|
||||
self._user = users.get_object(pk=user_id)
|
||||
except (AttributeError, KeyError, ValueError, users.UserDoesNotExist):
|
||||
from django.parts.auth import anonymoususers
|
||||
self._user = anonymoususers.AnonymousUser()
|
||||
return self._user
|
||||
|
||||
def _set_user(self, user):
|
||||
self._user = user
|
||||
|
||||
GET = property(_get_get, _set_get)
|
||||
POST = property(_get_post, _set_post)
|
||||
COOKIES = property(_get_cookies, _set_cookies)
|
||||
FILES = property(_get_files)
|
||||
REQUEST = property(_get_request)
|
||||
raw_post_data = property(_get_raw_post_data)
|
||||
user = property(_get_user, _set_user)
|
||||
|
||||
class WSGIHandler(BaseHandler):
|
||||
def __call__(self, environ, start_response):
|
||||
from django.conf import settings
|
||||
from django.core import db
|
||||
|
||||
if settings.ENABLE_PSYCO:
|
||||
import psyco
|
||||
@@ -154,15 +139,17 @@ class WSGIHandler(BaseHandler):
|
||||
if self._request_middleware is None:
|
||||
self.load_middleware()
|
||||
|
||||
dispatcher.send(signal=signals.request_started)
|
||||
try:
|
||||
request = WSGIRequest(environ)
|
||||
response = self.get_response(request.path, request)
|
||||
finally:
|
||||
db.db.close()
|
||||
|
||||
# Apply response middleware
|
||||
for middleware_method in self._response_middleware:
|
||||
response = middleware_method(request, response)
|
||||
# Apply response middleware
|
||||
for middleware_method in self._response_middleware:
|
||||
response = middleware_method(request, response)
|
||||
|
||||
finally:
|
||||
dispatcher.send(signal=signals.request_finished)
|
||||
|
||||
try:
|
||||
status_text = STATUS_CODE_TEXT[response.status_code]
|
||||
|
||||
Reference in New Issue
Block a user