Django 2.1.3 视图层 存储API

文件对象 | 总目录 | 管理文件


译者注:本地测试系统为widows 10

1. 获取当前存储类

Django提供了两种方便的方法来访问当前的存储类:

class DefaultStorage

DefaultStorage提供对当前默认存储系统的惰性(lazy) 访问,如 DEFAULT_FILE_STORAGE 中所述。DefaultStorage在内部使用get_storage_class() 方法。

get_storage_class(import_path=None)

返回实现存储API的类或模块。

在没有import_path参数的情况下,将返回当前 DEFAULT_FILE_STORAGE 设置的默认的存储系统 。如果提供了import_path, 将尝试从给定路径导入类或模块,并在成功时返回它。如果导入不成功,将引发异常。

from django.core.files.storage import get_storage_class
print(get_storage_class())
# 输出结果
<class 'django.core.files.storage.FileSystemStorage'>

2. 存储类

2.1 FileSystemStorage类

class FileSystemStorage(location=None, base_url=None, file_permissions_mode=None, directory_permissions_mode=None)

FileSystemStorage类实现对本地文件系统的基本文件存储。它继承自 Storage并提供其所有公共方法的实现。

location

保存文件的目录的绝对路径。默认为您的 MEDIA_ROOT 设置值。

>>> from django.core.files.storage import FileSystemStorage
>>> fs.location
'D:\\djpro\\learn'

base_url

提供存储在此位置的文件的URL。默认为您的 MEDIA_URL 设置值。

>>> from django.conf import settings
>>> settings.MEDIA_ROOT
''
>>> fs.base_url
''

file_permissions_mode

保存文件时文件系统权限。默认为 FILE_UPLOAD_PERMISSIONS

>>> fs.file_permissions_mode
>>> fs.file_permissions_mode is None
True

directory_permissions_mode

保存目录时将接收的文件系统权限。默认为FILE_UPLOAD_DIRECTORY_PERMISSIONS

注意
如果给定的文件名不存在,则 FileSystemStorage.delete() 方法不会引发异常。

>>> fs.directory_permissions_mode is None
True

get_created_time(name)

返回系统的时钟时间的datetime,即 os.path.getctime()。在某些系统(如Unix)上,这是最后一次元数据更改的时间,而在其他系统(如Windows)上,则是文件的创建时间。

>>> fs.get_created_time('1.PNG')
datetime.datetime(2018, 12, 21, 14, 12, 42, 546314)

2.2 Storage类

class Storage

Storage类为存储文件提供了一系列标准API,使用一组所有其他存储系统可以继承或根据需要覆盖默认行为。

注意
当方法返回navie datetime对象时,使用的有效时区将是当前os.environ['TZ']值; 请注意,这通常是Django设置中的TIME_ZONE

delete(name)

删除引用的名为name的文件。如果目标存储系统上不支持删除,这将抛出异常NotImplementedError

>>> from django.core.files.storage import Storage
>>> from django.core.files.storage import FileSystemStorage
>>> s = Storage()
>>> s.delete('1.PNG')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Python37\lib\site-packages\django\core\files\storage.py", line 115, in delete
    raise NotImplementedError('subclasses of Storage must provide a delete() method')
NotImplementedError: subclasses of Storage must provide a delete() method

>>> fs = FileSystemStorage()
>>> fs.delete('1.PNG') # 成功删除

exists(name)

如果给定的name引用的文件在存储系统中已经存在,返回True;或者False如果name可用于一个新的文件。

>>> fs = FileSystemStorage()
>>> fs.exists('1.PNG')
True

get_accessed_time(name)

返回文件的上次访问时间datetime。对于无法返回上次访问时间的存储系统,这将引发NotImplementedError。

如果USE_TZ=True,则返回一个感知型的datetime,否则在本地时区返回一个天真型(naive) 的datetime。

>>> fs.get_accessed_time('1.PNG')
datetime.datetime(2018, 12, 21, 14, 12, 42, 868682)

get_available_name(name, max_length=None)

返回基于name参数的文件名,该name是不与系统其他文件不重复的,可用于在目标存储系统上写入的新内容。

如果提供,文件名的长度不会超过max_length。如果找不到唯一文件名, 则会引发异常SuspiciousFileOperation。

如果文件name已存在,则在扩展名之前将下划线加上随机的7个字符的字母数字字符串附加到文件名。

>>> fs.exists('1.PNG')
True
>>> fs.get_available_name('1.PNG')
'1_JO4vUa7.PNG'
>>> fs.get_available_name('1.PNG')
'1_7CsmN5W.PNG'
>>> fs.get_available_name('2.PNG')
'2.PNG'

get_created_time(name)

返回文件的创建时间的datetime。对于无法返回创建时间的存储系统,这将抛出异常 NotImplementedError。

如果USE_TZ=True,则返回一个感知型的datetime,否则在本地时区返回一个天真型(naive) 的datetime。

get_modified_time(name)

返回文件的上次修改时间的datetime。对于无法返回上次修改时间的存储系统,这将抛出异常NotImplementedError。

如果USE_TZ=True,则返回一个感知型的datetime,否则在本地时区返回一个天真型(naive) 的datetime。

get_valid_name(name)

返回适合在目标存储系统上使用name参数返回的文件名。

generate_filename(filename)

通过调用get_valid_name()验证filename,并将filename传递给save()方法。

该filename参数可能包括路径(由FileField.upload_to返回) 。在这种情况下,路径将不会传递给 get_valid_name(),但会先添加回结果名称。

默认实现使用os.path操作。如果这不适合您的存储,请覆盖此方法。

listdir(path)

列出指定路径的内容,返回2元组列表; 第一项是目录,第二项是文件。对于无法提供此类列表的存储系统,这将引发NotImplementedError。

>>> fs.listdir('.')
(['.idea', 'formats', 'learn', 'news', 'polls', 'static', 'templates', 'topic', 'tour', 'venv'], ['1.PNG', '5bc58b6d63c04.jpg.PNG', 'db.sqlite3', 'manage.py', 'outtest.py'])

open(name, mode=‘rb’)

打开给定name的文件。请注意,虽然返回的文件保证是一个File对象,但它实际上可能是某个子类。在远程文件存储的情况下,这意味着读/写可能非常慢,因此请注意。

>>> f = fs.open('1.PNG',mode='rb')
>>> type(f)
<class 'django.core.files.base.File'>

path(name)

可以使用Python内置open()打开文件的标准本地文件系统路径。对于无法从本地文件系统访问的存储系统,这将引发NotImplementedError。

>>> fs.path('1.PNG')
'D:\\djpro\\learn\\1.PNG'

save(name, content, max_length=None)

使用存储系统保存新文件,最好使用指定的name。如果已存在具有此名称的文件name,则存储系统可根据需要修改文件名以获取唯一名称。将返回存储文件的实际名称。

这个max_length参数被传递给了 get_available_name()。

content参数必须是 django.core.files.File 类 的实例或可以包装在一个File中的类文件对象。

>>> from django.core.files import File
>>> fs.exists('2.PNG')
False
>>> f1 = open('1.PNG','rb')
>>> f1File = File(f1)
>>> fs.save('2.PNG',f1File)
'2.PNG'
>>> fs.exists('2.PNG')
True

size(name)

返回引用的name文件的总大小(以字节为单位)。对于无法返回文件大小的存储系统,这将会引发NotImplementedError。

>>> fs.size('2.PNG')
6355
>>> fs.size('2.PNG') == fs.size('1.PNG')
True

url(name)

返回name引用的文件内容的可以访问的URL 。对于不支持通过URL访问的存储系统,这将会引发NotImplementedError。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值