在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 編寫自定義存儲系統(tǒng)
編寫自定義存儲系統(tǒng)
高級
編寫你的第一個Django應(yīng)用,第5部分
視圖層
Django管理文檔生成器
編寫你的第一個 Django 程序 第3部分
編寫你的第一個Django應(yīng)用,第6部分
模型層
中間件
測試
數(shù)據(jù)庫訪問優(yōu)化
文件上傳
中間件
驗證器
基于類的內(nèi)建通用視圖
部署靜態(tài)文件
使用Django認(rèn)證系統(tǒng)
高級教程:如何編寫可重用的應(yīng)用
Model 類參考
Django 初探
使用Django輸出PDF
模型的實例
模型
文件上傳
進行原始的sql查詢
面向程序員
中間件
編寫數(shù)據(jù)庫遷移
TemplateResponse 和 SimpleTemplateResponse
異常
Django中的測試
基礎(chǔ)
管理器
File對象
URL調(diào)度器
加密簽名
國際化和本地化
日志
查詢集
django-admin 和 manage.py
使用基于類的視圖處理表單
聚合
內(nèi)建基于類的視圖的API
如何使用會話
部署 Django
其它
其它核心功能
高級
Django中的密碼管理
模型元選項
按需內(nèi)容處理
查找 API 參考
高級
Django 的快捷函數(shù)
Django 的設(shè)置
Admin
開發(fā)過程
新手入門
基于類的視圖
模型實例參考
信號
表單素材 ( <code>Media</code> 類)
自定義查找
常見的網(wǎng)站應(yīng)用工具
模型
django.contrib.humanize
Django模版語言
點擊劫持保護
管理操作
編寫你的第一個 Django 程序 第2部分
Django安全
模式編輯器
多數(shù)據(jù)庫
部署
基于類的視圖
內(nèi)建的視圖
視圖裝飾器
面向設(shè)計師
編寫視圖
應(yīng)用程序
如何使用WSGI 部署
參考
表單 API
文件儲存API
認(rèn)證
國際化和本地化
錯誤報告
基礎(chǔ)
基礎(chǔ)
將遺留數(shù)據(jù)庫整合到Django
教程
Django異常
編寫你的第一個 Django 程序 第4部分
遷移
分頁
重定向應(yīng)用
表單
從零開始
為模型提供初始數(shù)據(jù)
設(shè)置
使用Django輸出CSV
關(guān)聯(lián)對象參考
使用表單
Django 中的用戶認(rèn)證
快速安裝指南
安全問題歸檔
數(shù)據(jù)庫函數(shù)
編寫自定義的django-admin命令
高級教程
管理文件
格式本地化
基于類的通用視圖 —— 索引
安全
系統(tǒng)檢查框架
為Django編寫首個補丁
模板層
Widgets
編寫你的第一個 Django 程序 第1部分
執(zhí)行查詢

編寫自定義存儲系統(tǒng)

如果你需要提供自定義文件存儲 – 一個普遍的例子是在某個遠(yuǎn)程系統(tǒng)上儲存文件 – 你可以通過定義一個自定義的儲存類來實現(xiàn)。你需要遵循以下步驟:

1. 你的自定義儲存類必須是django.core.files.storage.Storage的子類:

from django.core.files.storage import Storage

class MyStorage(Storage):
    ...

2. Django必須能夠不帶任何參數(shù)來實例化你的儲存類。這意味著任何設(shè)置都應(yīng)該從django.conf.settings中獲取。

from django.conf import settings
from django.core.files.storage import Storage

class MyStorage(Storage):
    def __init__(self, option=None):
        if not option:
            option = settings.CUSTOM_STORAGE_OPTIONS
        ...

3. 你的儲存類必須實現(xiàn) _open()_save()方法,以及任何適合于你的儲存類的其它方法。更多這類方法請見下文。

另外,如果你的類提供本地文件存儲,它必須覆寫path()方法。

4. 你的儲存類必須是 可以析構(gòu)的,所以它在遷移中的一個字段上使用的時候可以被序列化。只要你的字段擁有自己可以序列化的參數(shù),你就可以為它使用django.utils.deconstruct.deconstructible類裝飾器(這也是Django用在FileSystemStorage上的東西)。

默認(rèn)情況下,下面的方法會拋出NotImplementedError異常,并且必須覆寫它們。

然而要注意,并不是這些方法全部都需要,可以故意省略一些??梢圆槐貙崿F(xiàn)每個方法而仍然能擁有一個可以工作的儲存類。

比如,如果在特定的儲存后端中,列出內(nèi)容的開銷比較大,你可以決定不實現(xiàn)Storage.listdir

另一個例子是只處理寫入文件的后端。這種情況下,你不需要實現(xiàn)上面的任意一種方法。

根本上來說,需要實現(xiàn)哪種方法取決于你。如果不去實現(xiàn)一些方法,你會得到一個不完整(可能是不能用的)的接口。

你也會經(jīng)常想要使用特意為自定義儲存對象設(shè)計的鉤子。它們是:

_open(name, mode='rb')

必需的。

Storage.open()調(diào)用,這是儲存類用于打開文件的實際工具。它必須返回File對象,在大多數(shù)情況下,你會想要返回一些子類,它們實現(xiàn)了后端儲存系統(tǒng)特定的邏輯。

_save(name, content)

Storage.save()調(diào)用。name必須事先通過get_valid_name()get_available_name()過濾,并且content自己必須是一個File對象。

應(yīng)該返回被保存文件的真實名稱(通常是傳進來的name,但是如果儲存需要修改文件名稱,則返回新的名稱來代替)。

get_valid_name(name)

返回適用于當(dāng)前儲存系統(tǒng)的文件名。傳遞給該方法的name參數(shù)是發(fā)送給服務(wù)器的原始文件名稱,并移除了所有目錄信息。你可以覆寫這個方法,來自定義非標(biāo)準(zhǔn)的字符將會如何轉(zhuǎn)換為安全的文件名稱。

Storage提供的代碼只會保留原始文件名中的數(shù)字和字母字符、英文句號和下劃線,并移除其它字符。

get_available_name(name, max_length=None)

返回在儲存系統(tǒng)中可用的文件名稱,可能會顧及到提供的文件名稱。傳給這個方法的name參數(shù)需要事先過濾為儲存系統(tǒng)有效的文件名稱,根據(jù)上面描述的get_valid_name() 方法。

如果提供了max_length,文件名稱長度不會超過它。如果不能找到可用的、唯一的文件名稱,會拋出SuspiciousFileOperation 異常。

如果name命名的文件已存在,一個下劃線加上隨機7個數(shù)字或字母的字符串會添加到文件名稱的末尾,擴展名之前。

Changed in Django 1.7:

之前,下劃線和一位數(shù)字(比如"_1", "_2",以及其他)會添加到文件名稱的末尾,直到目標(biāo)目錄中發(fā)現(xiàn)了可用的名稱。一些惡意的用戶會利用這一確定性的算法來進行dos攻擊。 這一變化也在1.6.6, 1.5.9, 和 1.4.14中出現(xiàn)。
Changed in Django 1.8:

新增了max_length參數(shù)。

自定義儲存系統(tǒng) 以相同方式工作:你可以把它們作為storage參數(shù)傳遞給FileField。

譯者:Django 文檔協(xié)作翻譯小組,原文:Custom storage。

本文以 CC BY-NC-SA 3.0 協(xié)議發(fā)布,轉(zhuǎn)載請保留作者署名和文章出處。

Django 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。交流群:467338606。

上一篇:中間件下一篇:進行原始的sql查詢