/django/contrib/staticfiles/handlers.py
Python | 68 lines | 53 code | 6 blank | 9 comment | 1 complexity | 77f45708bd494357ff77d098543523bb MD5 | raw file
Possible License(s): BSD-3-Clause
- import urllib
- from urlparse import urlparse
- from django.conf import settings
- from django.core.handlers.wsgi import WSGIHandler
- from django.contrib.staticfiles import utils
- from django.contrib.staticfiles.views import serve
- class StaticFilesHandler(WSGIHandler):
- """
- WSGI middleware that intercepts calls to the static files directory, as
- defined by the STATIC_URL setting, and serves those files.
- """
- def __init__(self, application, base_dir=None):
- self.application = application
- # Always call get_base_dir() to give subclasses control
- self.base_dir = self.get_base_dir(base_dir)
- self.base_url = urlparse(self.get_base_url())
- super(StaticFilesHandler, self).__init__()
- def get_base_dir(self, base_dir=None):
- if base_dir: return base_dir
- return settings.STATIC_ROOT
- def get_base_url(self):
- utils.check_settings()
- return settings.STATIC_URL
- def _should_handle(self, path):
- """
- Checks if the path should be handled. Ignores the path if:
- * the host is provided as part of the base_url
- * the request's path isn't under the media path (or equal)
- """
- return (self.base_url[2] != path and
- path.startswith(self.base_url[2]) and not self.base_url[1])
- def file_path(self, url):
- """
- Returns the relative path to the media file on disk for the given URL.
- """
- relative_url = url[len(self.base_url[2]):]
- return urllib.url2pathname(relative_url)
- def serve(self, request):
- """
- Actually serves the request path.
- """
- return serve(request, self.file_path(request.path), insecure=True)
- def get_response(self, request):
- from django.http import Http404
- if self._should_handle(request.path):
- try:
- return self.serve(request)
- except Http404, e:
- if settings.DEBUG:
- from django.views import debug
- return debug.technical_404_response(request, e)
- return super(StaticFilesHandler, self).get_response(request)
- def __call__(self, environ, start_response):
- if not self._should_handle(environ['PATH_INFO']):
- return self.application(environ, start_response)
- return super(StaticFilesHandler, self).__call__(environ, start_response)