django-filetransfers / filetransfers / api.py

from django.conf import settings
from django.utils.importlib import import_module
import mimetypes

PREPARE_UPLOAD_BACKEND = getattr(settings,
    'PREPARE_UPLOAD_BACKEND',
    'filetransfers.backends.default.prepare_upload')
SERVE_FILE_BACKEND = getattr(settings,
    'SERVE_FILE_BACKEND',
    'filetransfers.backends.default.serve_file')
PUBLIC_DOWNLOAD_URL_BACKEND = getattr(settings,
    'PUBLIC_DOWNLOAD_URL_BACKEND',
    'filetransfers.backends.default.public_download_url')

_backends_cache = {}

# Public API
def prepare_upload(request, url, private=False, backend=None):
    handler = _load_backend(backend, PREPARE_UPLOAD_BACKEND)
    return handler(request, url, private=private)

def serve_file(request, file, backend=None, save_as=False, content_type=None):
    # Backends are responsible for handling range requests.
    handler = _load_backend(backend, SERVE_FILE_BACKEND)
    filename = file.name.rsplit('/')[-1]
    if save_as is True:
        save_as = filename
    if not content_type:
        content_type = mimetypes.guess_type(filename)[0]
    return handler(request, file, save_as=save_as, content_type=content_type)

def public_download_url(file, backend=None):
    handler = _load_backend(backend, PUBLIC_DOWNLOAD_URL_BACKEND)
    return handler(file)

# Internal utilities
def _load_backend(backend, default_backend):
    if backend is None:
        backend = default_backend
    if backend not in _backends_cache:
        module_name, func_name = backend.rsplit('.', 1)
        _backends_cache[backend] = getattr(import_module(module_name), func_name)
    return _backends_cache[backend]
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.