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

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

管理文件

這篇文檔描述了Django為那些用戶上傳文件準(zhǔn)備的文件訪問(wèn)API。底層的API足夠通用,你可以使用為其它目的來(lái)使用它們。如果你想要處理靜態(tài)文件(JS,CSS,以及其他),參見(jiàn)管理靜態(tài)文件(CSS和圖像)。

通常,Django使用MEDIA_ROOTMEDIA_URL設(shè)置在本地儲(chǔ)存文件。下面的例子假設(shè)你使用這些默認(rèn)值。

然而,Django提供了一些方法來(lái)編寫自定義的 文件儲(chǔ)存系統(tǒng),允許你完全自定義Django在哪里以及如何儲(chǔ)存文件。這篇文檔的另一部分描述了這些儲(chǔ)存系統(tǒng)如何工作。

在模型中使用文件

當(dāng)你使用FileField 或者 ImageField的時(shí)候,Django為你提供了一系列的API用來(lái)處理文件。

考慮下面的模型,它使用ImageField來(lái)儲(chǔ)存一張照片:

from django.db import models

class Car(models.Model):
    name = models.CharField(max_length=255)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    photo = models.ImageField(upload_to='cars')

任何Car的實(shí)例都有一個(gè) photo字段,你可以通過(guò)它來(lái)獲取附加圖片的詳細(xì)信息:

>>> car = Car.objects.get(name="57 Chevy")
>>> car.photo
<ImageFieldFile: chevy.jpg>
>>> car.photo.name
'cars/chevy.jpg'
>>> car.photo.path
'/media/cars/chevy.jpg'
>>> car.photo.url
'http://media.example.com/cars/chevy.jpg'

例子中的car.photo 對(duì)象是一個(gè)File 對(duì)象,這意味著它擁有下面描述的所有方法和屬性。

注意

文件保存是數(shù)據(jù)庫(kù)模型保存的一部分,所以磁盤上真實(shí)的文件名在模型保存之前并不可靠。

例如,你可以通過(guò)設(shè)置文件的 name屬性為一個(gè)和文件儲(chǔ)存位置 (MEDIA_ROOT,如果你使用默認(rèn)的FileSystemStorage)相關(guān)的路徑,來(lái)修改文件名稱。

>>> import os
>>> from django.conf import settings
>>> initial_path = car.photo.path
>>> car.photo.name = 'cars/chevy_ii.jpg'
>>> new_path = settings.MEDIA_ROOT + car.photo.name
>>> # Move the file on the filesystem
>>> os.rename(initial_path, new_path)
>>> car.save()
>>> car.photo.path
'/media/cars/chevy_ii.jpg'
>>> car.photo.path == new_path
True

File

當(dāng)Django需要表示一個(gè)文件的時(shí)候,它在內(nèi)部使用django.core.files.File實(shí)例。這個(gè)對(duì)象是 Python 內(nèi)建文件對(duì)象的一個(gè)簡(jiǎn)單封裝,并帶有一些Django特定的附加功能。

大多數(shù)情況你可以簡(jiǎn)單地使用Django提供給你的File對(duì)象(例如像上面那樣把文件附加到模型,或者是上傳的文件)。

如果你需要自行構(gòu)造一個(gè)File對(duì)象,最簡(jiǎn)單的方法是使用Python內(nèi)建的file 對(duì)象來(lái)創(chuàng)建一個(gè):

>>> from django.core.files import File

# Create a Python file object using open()
>>> f = open('/tmp/hello.world', 'w')
>>> myfile = File(f)

現(xiàn)在你可以使用 File類的任何文檔中記錄的屬性和方法了。

注意這種方法創(chuàng)建的文件并不會(huì)自動(dòng)關(guān)閉。以下步驟可以用于自動(dòng)關(guān)閉文件:

>>> from django.core.files import File

# Create a Python file object using open() and the with statement
>>> with open('/tmp/hello.world', 'w') as f:
...     myfile = File(f)
...     myfile.write('Hello World')
...
>>> myfile.closed
True
>>> f.closed
True

在處理大量對(duì)象的循環(huán)中訪問(wèn)文件字段時(shí),關(guān)閉文件極其重要。如果文件在訪問(wèn)之后沒(méi)有手動(dòng)關(guān)閉,會(huì)有消耗完文件描述符的風(fēng)險(xiǎn)。這可能導(dǎo)致如下錯(cuò)誤:

IOError: [Errno 24] Too many open files

文件儲(chǔ)存

在背后,Django需要決定在哪里以及如何將文件儲(chǔ)存到文件系統(tǒng)。這是一個(gè)對(duì)象,它實(shí)際上理解一些東西,比如文件系統(tǒng),打開(kāi)和讀取文件,以及其他。

Django的默認(rèn)文件儲(chǔ)存由DEFAULT_FILE_STORAGE設(shè)置提供。如果你沒(méi)有顯式提供一個(gè)儲(chǔ)存系統(tǒng),就會(huì)使用它。

關(guān)于內(nèi)建的默認(rèn)文件儲(chǔ)存系統(tǒng)的細(xì)節(jié),請(qǐng)參見(jiàn)下面一節(jié)。另外,關(guān)于編寫你自己的文件儲(chǔ)存系統(tǒng)的一些信息,請(qǐng)見(jiàn)編寫自定義的文件系統(tǒng)。

儲(chǔ)存對(duì)象

大多數(shù)情況你可能并不想使用File對(duì)象(它向文件提供適當(dāng)?shù)拇鎯?chǔ)功能),你可以直接使用文件儲(chǔ)存系統(tǒng)。你可以創(chuàng)建一些自定義文件儲(chǔ)存類的實(shí)例,或者 – 大多數(shù)情況更加有用的 – 你可以使用全局的默認(rèn)儲(chǔ)存系統(tǒng):

>>> from django.core.files.storage import default_storage
>>> from django.core.files.base import ContentFile

>>> path = default_storage.save('/path/to/file', ContentFile('new content'))
>>> path
'/path/to/file'

>>> default_storage.size(path)
11
>>> default_storage.open(path).read()
'new content'

>>> default_storage.delete(path)
>>> default_storage.exists(path)
False

關(guān)于文件儲(chǔ)存API,參見(jiàn) 文件儲(chǔ)存API。

內(nèi)建的文件系統(tǒng)儲(chǔ)存類

Django自帶了django.core.files.storage.FileSystemStorage 類,它實(shí)現(xiàn)了基本的本地文件系統(tǒng)中的文件儲(chǔ)存。

例如,下面的代碼會(huì)在 /media/photos 目錄下儲(chǔ)存上傳的文件,無(wú)論MEDIA_ROOT設(shè)置是什么:

from django.db import models
from django.core.files.storage import FileSystemStorage

fs = FileSystemStorage(location='/media/photos')

class Car(models.Model):
    ...
    photo = models.ImageField(storage=fs)

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

譯者:Django 文檔協(xié)作翻譯小組,原文:Managing files

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

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

上一篇:高級(jí)下一篇:查找 API 參考