app/django/core/servers/basehttp.py
changeset 323 ff1a9aa48cfd
parent 54 03e267d67478
equal deleted inserted replaced
322:6641e941ef1e 323:ff1a9aa48cfd
     9 
     9 
    10 from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
    10 from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
    11 import mimetypes
    11 import mimetypes
    12 import os
    12 import os
    13 import re
    13 import re
       
    14 import stat
    14 import sys
    15 import sys
    15 import urllib
    16 import urllib
    16 
    17 
    17 from django.utils.http import http_date
    18 from django.utils.http import http_date
    18 
    19 
    19 __version__ = "0.1"
    20 __version__ = "0.1"
    20 __all__ = ['WSGIServer','WSGIRequestHandler','demo_app']
    21 __all__ = ['WSGIServer','WSGIRequestHandler']
    21 
    22 
    22 server_version = "WSGIServer/" + __version__
    23 server_version = "WSGIServer/" + __version__
    23 sys_version = "Python/" + sys.version.split()[0]
    24 sys_version = "Python/" + sys.version.split()[0]
    24 software_version = server_version + ' ' + sys_version
    25 software_version = server_version + ' ' + sys_version
    25 
    26 
   549     server_version = "WSGIServer/" + __version__
   550     server_version = "WSGIServer/" + __version__
   550 
   551 
   551     def __init__(self, *args, **kwargs):
   552     def __init__(self, *args, **kwargs):
   552         from django.conf import settings
   553         from django.conf import settings
   553         self.admin_media_prefix = settings.ADMIN_MEDIA_PREFIX
   554         self.admin_media_prefix = settings.ADMIN_MEDIA_PREFIX
       
   555         # We set self.path to avoid crashes in log_message() on unsupported
       
   556         # requests (like "OPTIONS").
       
   557         self.path = ''
   554         BaseHTTPRequestHandler.__init__(self, *args, **kwargs)
   558         BaseHTTPRequestHandler.__init__(self, *args, **kwargs)
   555 
   559 
   556     def get_environ(self):
   560     def get_environ(self):
   557         env = self.server.base_environ.copy()
   561         env = self.server.base_environ.copy()
   558         env['SERVER_PROTOCOL'] = self.request_version
   562         env['SERVER_PROTOCOL'] = self.request_version
   643             except IOError:
   647             except IOError:
   644                 status = '401 UNAUTHORIZED'
   648                 status = '401 UNAUTHORIZED'
   645                 headers = {'Content-type': 'text/plain'}
   649                 headers = {'Content-type': 'text/plain'}
   646                 output = ['Permission denied: %s' % file_path]
   650                 output = ['Permission denied: %s' % file_path]
   647             else:
   651             else:
   648                 status = '200 OK'
   652                 # This is a very simple implementation of conditional GET with
   649                 headers = {}
   653                 # the Last-Modified header. It makes media files a bit speedier
   650                 mime_type = mimetypes.guess_type(file_path)[0]
   654                 # because the files are only read off disk for the first
   651                 if mime_type:
   655                 # request (assuming the browser/client supports conditional
   652                     headers['Content-Type'] = mime_type
   656                 # GET).
   653                 output = [fp.read()]
   657                 mtime = http_date(os.stat(file_path)[stat.ST_MTIME])
   654                 fp.close()
   658                 headers = {'Last-Modified': mtime}
       
   659                 if environ.get('HTTP_IF_MODIFIED_SINCE', None) == mtime:
       
   660                     status = '304 NOT MODIFIED'
       
   661                     output = []
       
   662                 else:
       
   663                     status = '200 OK'
       
   664                     mime_type = mimetypes.guess_type(file_path)[0]
       
   665                     if mime_type:
       
   666                         headers['Content-Type'] = mime_type
       
   667                     output = [fp.read()]
       
   668                     fp.close()
   655         start_response(status, headers.items())
   669         start_response(status, headers.items())
   656         return output
   670         return output
   657 
   671 
   658 def run(addr, port, wsgi_handler):
   672 def run(addr, port, wsgi_handler):
   659     server_address = (addr, port)
   673     server_address = (addr, port)