Package: django-titofisto
This is a simple extension to Django’sFileSystemStoragethat adds a URL
parameter carrying a shared token, which is only valid for a defined period
of time.Additionally, a like-wise time-constrained file upload slot mechanism is
available.FunctionalityFile storage with token-secured URLsThis is a drop-in replacement for the DjangoFileSystemStorage, usable if
media files are served by Django itself. It does currently not work if media
files are served from an independent web server.The storage and its accompanying view do the following:When a URL to a storage file is generated, a HMAC-based token is generatedThe token and the timestamp when it was generated are appended as request
parameters to the URLUpon retrieval of the file through the accompanying view, the requested
file name and the passed timestamp are used to recalculate the HMAC-based
tokenOnly if the tokens match, and a configured timeout has not passed, is the
file servedThe signature-based token ensures that the token is invalidated when:The filename changesThe timestamp changesThe mtime of the file changesTheSECRET_KEYchangesTime-constrained uplaod slotThe upload slot mechanism can be used to generically handle file uploads
by clients that can not upload files with a regular request. One example
for this is a client using GraphQL to talk to Django, because GraphQL
does not support file uploads and rather suggests to do uplaods
out-of-band.With Titofisto’s upload slot mechanism, calling code can request a secure
URL which it can hand out to a client. When the client POSTs its file
to the endpoint, a previously provided callback is called to handle the
uploaded file.InstallationTo adddjango-titofistoto a project, first add it as dependency to your
project, e.g. usingpoetry:$ poetry add django-titofistodjango-titofistowill use the baseFileSystemStoragefor almost everything,
including determining theMEDIA_ROOT. It merely adds a token as URL parameter
to whatever the baseFileSystemStorage.url()method returns.Add the following to your settings:DEFAULT_FILE_STORAGE = "titofisto.TitofistoStorage"
TITOFISTO_TIMEOUT = 3600  # optional, this is the default
TITOFISTO_PARAM = "titofisto_token"  # optional, this is the defaultAdd the following to your URL config:from django.conf import settings
from django.urls import include, path

urlpatterns += [
    path(settings.MEDIA_URL.removeprefix("/"), include("titofisto.urls")),
]Django will start serving media files under the configuredMEDIA_URL.Provide public media filesSometimes, there might be media files, for example favicons,
you want to be accessible without any authentication. Per default,django-titofistowill serve all files stored in the directorypublicwithout a token.
You can disable or configure this behavior using these settings:TITOFISTO_USE_PUBLIC_NAMESPACE = True # optional, this is the default
TITOFISTO_PUBLIC_NAMESPACE = "public/" # optional, this is the defaultUse the time-constrained upload slotTo enable the file upload mechanism, a setting must be set, because the
defaultupload/prefix could potentially shadow expected media file
URLs:TITOFISTO_ENABLE_UPLOAD = True
TITOFISTO_UPLOAD_NAMESPACE = "titofisto/upload/"A simplified example for using the upload slot mechanism is:from titofisto.views import TitofistoUploadView

def handle_file(request, pk):
    instance = MyModel.objects.get(pk=pk)
    instance.photo = request.FILES["photo"]
    instance.save()

# This gets an uplaod URL to pass on to the client
# On upload, the handler above will be called, with 15 as positional argument
upload_url = TitofistoUploadView.get_upload_slot(
    "mymodule.handle_file",
    (15,)
)Creditsdjango-titofistowas developed for theAlekSISschool information system by
its team:Copyright © 2021, 2023 Dominik George <dominik.george@teckids.org>
Copyright © 2021 Jonathan Weth <dev@jonathanweth.de>