Ticket #428: static_view.patch

File static_view.patch, 2.1 KB (added by Stan Seibert <volsung@…>, 10 years ago)

Static file view in the form of a patch against django trunk

  • django/views/static.py

    === django/views/static.py
    ==================================================================
     
     1from django.core.exceptions import Http404, ImproperlyConfigured
     2from django.utils.httpwrappers import HttpResponse
     3from django.conf import settings
     4import os
     5import posixpath
     6import urllib
     7import mimetypes
     8
     9def list_directory(path, fullpath):
     10    files = os.listdir(fullpath)
     11    response = """
     12<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
     13<html>
     14<head>
     15    <title>Index of %s/</title>
     16</head>
     17<body>
     18    <h1>Index of %s/</h1>
     19    <pre>
     20""" % (path, path)
     21    for f in files:
     22        if os.path.isdir(os.path.join(fullpath, f)):
     23            f += '/'
     24        response += '<a href="%s">%s</a>\n' % (f, f)
     25
     26    response += """
     27    </pre>
     28</body>
     29</html>
     30"""
     31    return response
     32
     33
     34def serve(request, path):
     35    if not hasattr(settings, 'DOCUMENT_ROOT'):
     36        raise ImproperlyConfigured, "DOCUMENT_ROOT not set in settings file"
     37   
     38    # Clean up path given in URL.
     39    # Algorithm taken from SimpleHTTPServer.translate_path()
     40    # Should only allow files below DOCUMENT_ROOT to be accessed.
     41    path = posixpath.normpath(urllib.unquote(path))
     42    parts = path.split('/')
     43    parts = filter(None, parts)
     44    path = ""
     45    for part in parts:
     46        drive, part = os.path.splitdrive(part)
     47        head, part = os.path.split(part)
     48        if part in (os.curdir, os.pardir): continue # Strip off . and ..
     49        path = os.path.join(path, part)
     50
     51    fullpath = os.path.join(settings.DOCUMENT_ROOT, path)
     52    try:
     53        if os.path.isdir(fullpath):
     54            response = HttpResponse(list_directory(path, fullpath),
     55                                   mimetype="text/html")
     56        else:
     57            mimetype = mimetypes.guess_type(fullpath)[0]
     58            f = open(fullpath, "rb")
     59            response = HttpResponse(f.read(), mimetype=mimetype)
     60            f.close()
     61           
     62        return response
     63    except IOError:
     64        raise Http404
Back to Top