123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- ================
- File storage API
- ================
- .. module:: django.core.files.storage
- Getting the default storage class
- =================================
- Django provides convenient ways to access the default storage class:
- .. data:: storages
- A dictionary-like object that allows retrieving a storage instance using
- its alias as defined by :setting:`STORAGES`.
- ``storages`` has an attribute ``backends``, which defaults to the raw value
- provided in :setting:`STORAGES`.
- Additionally, ``storages`` provides a ``create_storage()`` method that
- accepts the dictionary used in :setting:`STORAGES` for a backend, and
- returns a storage instance based on that backend definition. This may be
- useful for third-party packages needing to instantiate storages in tests:
- .. code-block:: pycon
- >>> from django.core.files.storage import storages
- >>> storages.backends
- {'default': {'BACKEND': 'django.core.files.storage.FileSystemStorage'},
- 'staticfiles': {'BACKEND': 'django.contrib.staticfiles.storage.StaticFilesStorage'},
- 'custom': {'BACKEND': 'package.storage.CustomStorage'}}
- >>> storage_instance = storages.create_storage({"BACKEND": "package.storage.CustomStorage"})
- .. class:: DefaultStorage
- :class:`~django.core.files.storage.DefaultStorage` provides
- lazy access to the default storage system as defined by ``default`` key in
- :setting:`STORAGES`. :class:`DefaultStorage` uses
- :data:`~django.core.files.storage.storages` internally.
- .. data:: default_storage
- :data:`~django.core.files.storage.default_storage` is an instance of the
- :class:`~django.core.files.storage.DefaultStorage`.
- The ``FileSystemStorage`` class
- ===============================
- .. class:: FileSystemStorage(location=None, base_url=None, file_permissions_mode=None, directory_permissions_mode=None, allow_overwrite=False)
- The :class:`~django.core.files.storage.FileSystemStorage` class implements
- basic file storage on a local filesystem. It inherits from
- :class:`~django.core.files.storage.Storage` and provides implementations
- for all the public methods thereof.
- .. note::
- The ``FileSystemStorage.delete()`` method will not raise an exception
- if the given file name does not exist.
- .. attribute:: location
- Absolute path to the directory that will hold the files.
- Defaults to the value of your :setting:`MEDIA_ROOT` setting.
- .. attribute:: base_url
- URL that serves the files stored at this location.
- Defaults to the value of your :setting:`MEDIA_URL` setting.
- .. attribute:: file_permissions_mode
- The file system permissions that the file will receive when it is
- saved. Defaults to :setting:`FILE_UPLOAD_PERMISSIONS`.
- .. attribute:: directory_permissions_mode
- The file system permissions that the directory will receive when it is
- saved. Defaults to :setting:`FILE_UPLOAD_DIRECTORY_PERMISSIONS`.
- .. attribute:: allow_overwrite
- .. versionadded:: 5.1
- Flag to control allowing saving a new file over an existing one.
- Defaults to ``False``.
- .. method:: get_created_time(name)
- Returns a :class:`~datetime.datetime` of the system's ctime, i.e.
- :func:`os.path.getctime`. On some systems (like Unix), this is the
- time of the last metadata change, and on others (like Windows), it's
- the creation time of the file.
- The ``InMemoryStorage`` class
- =============================
- .. class:: InMemoryStorage(location=None, base_url=None, file_permissions_mode=None, directory_permissions_mode=None)
- The :class:`~django.core.files.storage.InMemoryStorage` class implements
- a memory-based file storage. It has no persistence, but can be useful for
- speeding up tests by avoiding disk access.
- .. attribute:: location
- Absolute path to the directory name assigned to files. Defaults to the
- value of your :setting:`MEDIA_ROOT` setting.
- .. attribute:: base_url
- URL that serves the files stored at this location.
- Defaults to the value of your :setting:`MEDIA_URL` setting.
- .. attribute:: file_permissions_mode
- The file system permissions assigned to files, provided for
- compatibility with ``FileSystemStorage``. Defaults to
- :setting:`FILE_UPLOAD_PERMISSIONS`.
- .. attribute:: directory_permissions_mode
- The file system permissions assigned to directories, provided for
- compatibility with ``FileSystemStorage``. Defaults to
- :setting:`FILE_UPLOAD_DIRECTORY_PERMISSIONS`.
- The ``Storage`` class
- =====================
- .. class:: Storage
- The :class:`~django.core.files.storage.Storage` class provides a
- standardized API for storing files, along with a set of default
- behaviors that all other storage systems can inherit or override
- as necessary.
- .. note::
- When methods return naive ``datetime`` objects, the effective timezone
- used will be the current value of ``os.environ['TZ']``; note that this
- is usually set from Django's :setting:`TIME_ZONE`.
- .. method:: delete(name)
- Deletes the file referenced by ``name``. If deletion is not supported
- on the target storage system this will raise ``NotImplementedError``
- instead.
- .. method:: exists(name)
- Returns ``True`` if a file referenced by the given name already exists
- in the storage system.
- .. method:: get_accessed_time(name)
- Returns a :class:`~datetime.datetime` of the last accessed time of the
- file. For storage systems unable to return the last accessed time this
- will raise :exc:`NotImplementedError`.
- If :setting:`USE_TZ` is ``True``, returns an aware ``datetime``,
- otherwise returns a naive ``datetime`` in the local timezone.
- .. method:: get_alternative_name(file_root, file_ext)
- Returns an alternative filename based on the ``file_root`` and
- ``file_ext`` parameters, an underscore plus a random 7 character
- alphanumeric string is appended to the filename before the extension.
- .. method:: get_available_name(name, max_length=None)
- Returns a filename based on the ``name`` parameter that's free and
- available for new content to be written to on the target storage
- system.
- The length of the filename will not exceed ``max_length``, if provided.
- If a free unique filename cannot be found, a
- :exc:`SuspiciousFileOperation
- <django.core.exceptions.SuspiciousOperation>` exception will be raised.
- If a file with ``name`` already exists, :meth:`get_alternative_name` is
- called to obtain an alternative name.
- .. method:: get_created_time(name)
- Returns a :class:`~datetime.datetime` of the creation time of the file.
- For storage systems unable to return the creation time this will raise
- :exc:`NotImplementedError`.
- If :setting:`USE_TZ` is ``True``, returns an aware ``datetime``,
- otherwise returns a naive ``datetime`` in the local timezone.
- .. method:: get_modified_time(name)
- Returns a :class:`~datetime.datetime` of the last modified time of the
- file. For storage systems unable to return the last modified time this
- will raise :exc:`NotImplementedError`.
- If :setting:`USE_TZ` is ``True``, returns an aware ``datetime``,
- otherwise returns a naive ``datetime`` in the local timezone.
- .. method:: get_valid_name(name)
- Returns a filename based on the ``name`` parameter that's suitable
- for use on the target storage system.
- .. method:: generate_filename(filename)
- Validates the ``filename`` by calling :attr:`get_valid_name()` and
- returns a filename to be passed to the :meth:`save` method.
- The ``filename`` argument may include a path as returned by
- :attr:`FileField.upload_to <django.db.models.FileField.upload_to>`.
- In that case, the path won't be passed to :attr:`get_valid_name()` but
- will be prepended back to the resulting name.
- The default implementation uses :mod:`os.path` operations. Override
- this method if that's not appropriate for your storage.
- .. method:: listdir(path)
- Lists the contents of the specified path, returning a 2-tuple of lists;
- the first item being directories, the second item being files. For
- storage systems that aren't able to provide such a listing, this will
- raise a ``NotImplementedError`` instead.
- .. method:: open(name, mode='rb')
- Opens the file given by ``name``. Note that although the returned file
- is guaranteed to be a ``File`` object, it might actually be some
- subclass. In the case of remote file storage this means that
- reading/writing could be quite slow, so be warned.
- .. method:: path(name)
- The local filesystem path where the file can be opened using Python's
- standard ``open()``. For storage systems that aren't accessible from
- the local filesystem, this will raise ``NotImplementedError`` instead.
- .. method:: save(name, content, max_length=None)
- Saves a new file using the storage system, preferably with the name
- specified. If there already exists a file with this name ``name``, the
- storage system may modify the filename as necessary to get a unique
- name. The actual name of the stored file will be returned.
- The ``max_length`` argument is passed along to
- :meth:`get_available_name`.
- The ``content`` argument must be an instance of
- :class:`django.core.files.File` or a file-like object that can be
- wrapped in ``File``.
- .. method:: size(name)
- Returns the total size, in bytes, of the file referenced by ``name``.
- For storage systems that aren't able to return the file size this will
- raise ``NotImplementedError`` instead.
- .. method:: url(name)
- Returns the URL where the contents of the file referenced by ``name``
- can be accessed. For storage systems that don't support access by URL
- this will raise ``NotImplementedError`` instead.
|