文件存储 API¶
获取默认的存储类:¶
Django 提供了便捷的方式来访问默认的存储类:
- storages¶
A dictionary-like object that allows retrieving a storage instance using its alias as defined by
STORAGES
.storages
has an attributebackends
, which defaults to the raw value provided inSTORAGES
.Additionally,
storages
provides acreate_storage()
method that accepts the dictionary used inSTORAGES
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:>>> 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[源代码]¶
DefaultStorage
提供了对由STORAGES
中的default
键定义的默认存储系统的延迟访问。DefaultStorage
内部使用了storages
。
- default_storage¶
default_storage
是DefaultStorage
的一个实例。
FileSystemStorage
类¶
- class FileSystemStorage(location=None, base_url=None, file_permissions_mode=None, directory_permissions_mode=None, allow_overwrite=False)[源代码]¶
FileSystemStorage
类实现了本地文件系统的基本文件存储。它继承自Storage
类,并提供了其中所有公开方法的实现。备注
如果给定的文件名不存在,
FileSystemStorage.delete()
方法不会引发异常。- location[源代码]¶
存放文件的目录的绝对路径。 默认为你的
MEDIA_ROOT
配置的值。
- file_permissions_mode[源代码]¶
保存文件时,文件系统将获得的权限。默认为
FILE_UPLOAD_PERMISSIONS
。
- directory_permissions_mode[源代码]¶
保存目录时,该目录将获得的文件系统权限,默认为
FILE_UPLOAD_DIRECTORY_PERMISSIONS
。
- allow_overwrite¶
- New in Django 5.1.
Flag to control allowing saving a new file over an existing one. Defaults to
False
.
- get_created_time(name)[源代码]¶
返回系统 ctime 的
datetime
,即os.path.getctime()
。在某些系统上(如 Unix),这是最后一次修改元数据的时间,而在其他系统上(如 Windows),这是文件的创建时间。
InMemoryStorage
类¶
- class InMemoryStorage(location=None, base_url=None, file_permissions_mode=None, directory_permissions_mode=None)[源代码]¶
InMemoryStorage
类实现了基于内存的文件存储。它没有持久性,但可以通过避免磁盘访问来加速测试。- location[源代码]¶
文件分配的目录名称的绝对路径。默认值为
MEDIA_ROOT
设置的值。
- file_permissions_mode[源代码]¶
文件系统分配给文件的文件系统权限,为了与
FileSystemStorage
兼容而提供。默认值为FILE_UPLOAD_PERMISSIONS
。
- directory_permissions_mode[源代码]¶
文件系统分配给目录的文件系统权限,为了与
FileSystemStorage
兼容而提供。默认值为FILE_UPLOAD_DIRECTORY_PERMISSIONS
。
Storage
类¶
- class Storage[源代码]¶
Storage
类为存储文件提供了一个标准化的 API,以及一组默认行为,所有其他存储系统可以根据需要继承或覆盖。备注
当方法返回未处理的
datetime
对象时,所使用的有效时区将是os.environ['TZ']
的当前值;注意,这通常是由 Django 的TIME_ZONE
设置的。- exists(name)[源代码]¶
Returns
True
if a file referenced by the given name already exists in the storage system.
- get_accessed_time(name)[源代码]¶
返回文件最后访问时间的
datetime
。对于不能返回最后访问时间的存储系统,将引发NotImplementedError
。如果
USE_TZ
为True
,则返回一个处理过的datetime
,否则返回一个当地时区的未处理的datetime
。
- get_alternative_name(file_root, file_ext)[源代码]¶
根据
file_root
和file_ext
参数返回一个替代的文件名,一个下划线加上一个随机的 7 个字符的字母数字字符串被附加到文件名的扩展名之前。
- get_available_name(name, max_length=None)[源代码]¶
返回一个基于
name
参数的文件名,该文件名在目标存储系统中是空闲的,可供新内容写入。文件名的长度不会超过
max_length
,如果提供的话。如果不能找到一个空闲的唯一文件名,将引发一个SuspiciousFileOperation
异常。如果一个带有
name
的文件已经存在,则调用get_alternative_name()
来获得一个替代名称。
- get_created_time(name)[源代码]¶
返回文件的创建时间的
datetime
。对于不能返回创建时间的存储系统,将引发NotImplementedError
。如果
USE_TZ
为True
,则返回一个处理过的datetime
,否则返回一个当地时区的未处理的datetime
。
- get_modified_time(name)[源代码]¶
返回文件最后修改时间的
datetime
。对于不能返回最后修改时间的存储系统,将引发NotImplementedError
。如果
USE_TZ
为True
,则返回一个处理过的datetime
,否则返回一个当地时区的未处理的datetime
。
- generate_filename(filename)[源代码]¶
通过调用
get_valid_name()
验证文件名
,并返回一个文件名传给save()
方法。filename
参数可能包含FileField.upload_to
返回的路径。在这种情况下,路径不会被传递给get_valid_name()
,而是会被预输入到结果的名称中。默认实现使用
os.path
操作。如果不适合你的存储,请重写这个方法。
- open(name, mode='rb')[源代码]¶
打开由
name
给出的文件。请注意,虽然返回的文件保证是一个File
对象,但实际上它可能是某个子类。在远程文件存储的情况下,这意味着读/写可能会很慢,所以要注意。
- path(name)[源代码]¶
本地文件系统路径,在这里可以使用 Python 的标准
open()
打开文件。对于不能从本地文件系统访问的存储系统,这将引发NotImplementedError
。
- save(name, content, max_length=None)[源代码]¶
使用存储系统保存一个新的文件,最好使用指定的名称。如果已经存在一个带有这个名字
name
的文件,存储系统可以根据需要修改文件名以获得一个唯一的名字。将返回存储文件的实际名称。max_length
参数被传递给get_available_name()
。content
参数必须是django.core.files.File
的实例,或者是一个可以用File
包装的类文件对象。