summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Holovaty <adrian@holovaty.com>2008-09-17 05:42:12 +0000
committerAdrian Holovaty <adrian@holovaty.com>2008-09-17 05:42:12 +0000
commitcc7b0f986a8ef897fba258d03d0a43f3e1c5799e (patch)
treef42c1c75fd46e26d8a4a185a0e774446c7245a17
parent7a80a9fa7de4a9e466e66fb4d2b3242e5da67334 (diff)
Fixed #8409 -- The runserver now uses conditional GET for admin media files, instead of reloading the files off disk for every request. Thanks for reporting, andylowry
git-svn-id: http://code.djangoproject.com/svn/django/trunk@9055 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/core/servers/basehttp.py25
1 files changed, 18 insertions, 7 deletions
diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py
index f88f8c70bb..287143b794 100644
--- a/django/core/servers/basehttp.py
+++ b/django/core/servers/basehttp.py
@@ -11,6 +11,7 @@ from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import mimetypes
import os
import re
+import stat
import sys
import urllib
@@ -648,13 +649,23 @@ class AdminMediaHandler(object):
headers = {'Content-type': 'text/plain'}
output = ['Permission denied: %s' % file_path]
else:
- status = '200 OK'
- headers = {}
- mime_type = mimetypes.guess_type(file_path)[0]
- if mime_type:
- headers['Content-Type'] = mime_type
- output = [fp.read()]
- fp.close()
+ # This is a very simple implementation of conditional GET with
+ # the Last-Modified header. It makes media files a bit speedier
+ # because the files are only read off disk for the first
+ # request (assuming the browser/client supports conditional
+ # GET).
+ mtime = http_date(os.stat(file_path)[stat.ST_MTIME])
+ headers = {'Last-Modified': mtime}
+ if environ.get('HTTP_IF_MODIFIED_SINCE', None) == mtime:
+ status = '304 NOT MODIFIED'
+ output = []
+ else:
+ status = '200 OK'
+ mime_type = mimetypes.guess_type(file_path)[0]
+ if mime_type:
+ headers['Content-Type'] = mime_type
+ output = [fp.read()]
+ fp.close()
start_response(status, headers.items())
return output