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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章