From 199aa88ffb35b8d285a1ac2759f6fbfa1a2420e0 Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Fri, 12 Aug 2005 04:16:29 +0000 Subject: [PATCH] Moved django.core.handlers.wsgi.AdminMediaHandler to django.core.servers.basehttp. Makes more sense to have it in there, because its only use is for the development server. git-svn-id: http://code.djangoproject.com/svn/django/trunk@491 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/core/handlers/wsgi.py | 45 --------------------------------- django/core/management.py | 4 +-- django/core/servers/basehttp.py | 45 +++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 47 deletions(-) diff --git a/django/core/handlers/wsgi.py b/django/core/handlers/wsgi.py index 84d8db8bed6..b57c48040e2 100644 --- a/django/core/handlers/wsgi.py +++ b/django/core/handlers/wsgi.py @@ -144,48 +144,3 @@ class WSGIHandler(BaseHandler): output = [response.get_content_as_string('utf-8')] start_response(status, response_headers.items()) return output - -class AdminMediaHandler: - """ - WSGI middleware that intercepts calls to the admin media directory, as - defined by the ADMIN_MEDIA_PREFIX setting, and serves those images. - Use this ONLY LOCALLY, for development! This hasn't been tested for - security and is not super efficient. - """ - def __init__(self, application): - from django.conf import settings - import django - self.application = application - self.media_dir = django.__path__[0] + '/conf/admin_media' - self.media_url = settings.ADMIN_MEDIA_PREFIX - - def __call__(self, environ, start_response): - import os.path - - # Ignore requests that aren't under ADMIN_MEDIA_PREFIX. Also ignore - # all requests if ADMIN_MEDIA_PREFIX isn't a relative URL. - if self.media_url.startswith('http://') or self.media_url.startswith('https://') \ - or not environ['PATH_INFO'].startswith(self.media_url): - return self.application(environ, start_response) - - # Find the admin file and serve it up, if it exists and is readable. - relative_url = environ['PATH_INFO'][len(self.media_url):] - file_path = os.path.join(self.media_dir, relative_url) - if not os.path.exists(file_path): - status = '404 NOT FOUND' - headers = {'Content-type': 'text/plain'} - output = ['Page not found: %s' % file_path] - else: - try: - fp = open(file_path, 'r') - except IOError: - status = '401 UNAUTHORIZED' - headers = {'Content-type': 'text/plain'} - output = ['Permission denied: %s' % file_path] - else: - status = '200 OK' - headers = {} - output = [fp.read()] - fp.close() - start_response(status, headers.items()) - return output diff --git a/django/core/management.py b/django/core/management.py index b83dfb9e8fe..8b56ddd32b8 100644 --- a/django/core/management.py +++ b/django/core/management.py @@ -485,8 +485,8 @@ inspectdb.args = "[dbname]" def runserver(port): "Starts a lightweight Web server for development." - from django.core.servers.basehttp import run, WSGIServerException - from django.core.handlers.wsgi import AdminMediaHandler, WSGIHandler + from django.core.servers.basehttp import run, AdminMediaHandler, WSGIServerException + from django.core.handlers.wsgi import WSGIHandler if not port.isdigit(): sys.stderr.write("Error: %r is not a valid port number.\n" % port) sys.exit(1) diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py index 8e1ba39e6b7..57174e8c6ea 100644 --- a/django/core/servers/basehttp.py +++ b/django/core/servers/basehttp.py @@ -591,6 +591,51 @@ class WSGIRequestHandler(BaseHTTPRequestHandler): return sys.stderr.write("[%s] %s\n" % (self.log_date_time_string(), format % args)) +class AdminMediaHandler: + """ + WSGI middleware that intercepts calls to the admin media directory, as + defined by the ADMIN_MEDIA_PREFIX setting, and serves those images. + Use this ONLY LOCALLY, for development! This hasn't been tested for + security and is not super efficient. + """ + def __init__(self, application): + from django.conf import settings + import django + self.application = application + self.media_dir = django.__path__[0] + '/conf/admin_media' + self.media_url = settings.ADMIN_MEDIA_PREFIX + + def __call__(self, environ, start_response): + import os.path + + # Ignore requests that aren't under ADMIN_MEDIA_PREFIX. Also ignore + # all requests if ADMIN_MEDIA_PREFIX isn't a relative URL. + if self.media_url.startswith('http://') or self.media_url.startswith('https://') \ + or not environ['PATH_INFO'].startswith(self.media_url): + return self.application(environ, start_response) + + # Find the admin file and serve it up, if it exists and is readable. + relative_url = environ['PATH_INFO'][len(self.media_url):] + file_path = os.path.join(self.media_dir, relative_url) + if not os.path.exists(file_path): + status = '404 NOT FOUND' + headers = {'Content-type': 'text/plain'} + output = ['Page not found: %s' % file_path] + else: + try: + fp = open(file_path, 'r') + except IOError: + status = '401 UNAUTHORIZED' + headers = {'Content-type': 'text/plain'} + output = ['Permission denied: %s' % file_path] + else: + status = '200 OK' + headers = {} + output = [fp.read()] + fp.close() + start_response(status, headers.items()) + return output + def run(port, wsgi_handler): server_address = ('', port) httpd = WSGIServer(server_address, WSGIRequestHandler)