django 1.8 官方文档翻译: 3-3-4 管理文件
来源:互联网 发布:蜜蜂汇金是哪个软件 编辑:程序博客网 时间:2024/06/09 20:51
管理文件
这篇文档描述了Django为那些用户上传文件准备的文件访问API。底层的API足够通用,你可以使用为其它目的来使用它们。如果你想要处理静态文件(JS,CSS,以及其他),参见管理静态文件(CSS和图像)。
通常,Django使用MEDIA_ROOT
和 MEDIA_URL
设置在本地储存文件。下面的例子假设你使用这些默认值。
然而,Django提供了一些方法来编写自定义的 文件储存系统,允许你完全自定义Django在哪里以及如何储存文件。这篇文档的另一部分描述了这些储存系统如何工作。
在模型中使用文件
当你使用FileField
或者 ImageField
的时候,Django为你提供了一系列的API用来处理文件。
考虑下面的模型,它使用ImageField
来储存一张照片:
from django.db import modelsclass 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
的实例都有一个 photo
字段,你可以通过它来获取附加图片的详细信息:
>>> 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
对象是一个File
对象,这意味着它拥有下面描述的所有方法和属性。
注意
文件保存是数据库模型保存的一部分,所以磁盘上真实的文件名在模型保存之前并不可靠。
例如,你可以通过设置文件的 name
属性为一个和文件储存位置 (MEDIA_ROOT
,如果你使用默认的FileSystemStorage
)相关的路径,来修改文件名称。
>>> 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_pathTrue
File
当Django需要表示一个文件的时候,它在内部使用django.core.files.File
实例。这个对象是 Python 内建文件对象的一个简单封装,并带有一些Django特定的附加功能。
大多数情况你可以简单地使用Django提供给你的File
对象(例如像上面那样把文件附加到模型,或者是上传的文件)。
如果你需要自行构造一个File
对象,最简单的方法是使用Python内建的file
对象来创建一个:
>>> from django.core.files import File# Create a Python file object using open()>>> f = open('/tmp/hello.world', 'w')>>> myfile = File(f)
现在你可以使用 File
类的任何文档中记录的属性和方法了。
注意这种方法创建的文件并不会自动关闭。以下步骤可以用于自动关闭文件:
>>> 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.closedTrue>>> f.closedTrue
在处理大量对象的循环中访问文件字段时,关闭文件极其重要。如果文件在访问之后没有手动关闭,会有消耗完文件描述符的风险。这可能导致如下错误:
IOError: [Errno 24] Too many open files
文件储存
在背后,Django需要决定在哪里以及如何将文件储存到文件系统。这是一个对象,它实际上理解一些东西,比如文件系统,打开和读取文件,以及其他。
Django的默认文件储存由DEFAULT_FILE_STORAGE
设置提供。如果你没有显式提供一个储存系统,就会使用它。
关于内建的默认文件储存系统的细节,请参见下面一节。另外,关于编写你自己的文件储存系统的一些信息,请见编写自定义的文件系统。
储存对象
大多数情况你可能并不想使用File
对象(它向文件提供适当的存储功能),你可以直接使用文件储存系统。你可以创建一些自定义文件储存类的实例,或者 – 大多数情况更加有用的 – 你可以使用全局的默认储存系统:
>>> 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
关于文件储存API,参见 文件储存API。
内建的文件系统储存类
Django自带了django.core.files.storage.FileSystemStorage
类,它实现了基本的本地文件系统中的文件储存。
例如,下面的代码会在 /media/photos
目录下储存上传的文件,无论MEDIA_ROOT
设置是什么:
from django.db import modelsfrom django.core.files.storage import FileSystemStoragefs = FileSystemStorage(location='/media/photos')class Car(models.Model): ... photo = models.ImageField(storage=fs)
自定义储存系统 以相同方式工作:你可以把它们作为storage
参数传递给FileField
。
译者:Django 文档协作翻译小组,原文:Managing files。
本文以 CC BY-NC-SA 3.0 协议发布,转载请保留作者署名和文章出处。
Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606。
- django 1.8 官方文档翻译: 3-3-4 管理文件
- django 1.8 官方文档翻译:13-1-3 密码管理
- django 1.8 官方文档翻译: 3-3-1 文件上传
- django 1.8 官方文档翻译:7-3 Django管理文档生成器
- django 1.8 官方文档翻译: 2-4-3 模式编辑器
- django 1.8 官方文档翻译:6-3 Django异常
- django 1.8 官方文档翻译: 3-3-3 文件储存API
- django 1.8 官方文档翻译: 3-3-2 File对象
- django 1.8 官方文档翻译: 3-1-2 编写视图
- django 1.8 官方文档翻译: 3-6-1 中间件概览
- django 1.8 官方文档翻译: 8-3 点击劫持保护
- django 1.8 官方文档翻译:13-3 日志
- django 1.8 官方文档翻译:7-2 管理操作
- django 1.8 官方文档翻译: 3-4-3 使用基于类的视图处理表单
- django 1.8 官方文档翻译: 3-4-2 内建显示视图
- django 1.8 官方文档翻译: 3-4-1 基于类的视图
- django 1.8 官方文档翻译: 3-1-4 视图装饰器
- django 1.8 官方文档翻译: 3-4-5 内建基于类的视图的API
- 线性规划与网络流24题 01飞行员分配方案问题
- PAT Advanced 1019
- 线性规划与网络流24题 02太空飞行计划问题 最小割
- 漫谈C指针第六讲---从 const int i 说起
- 【Android进阶】-Android组合的方式自定义控件
- django 1.8 官方文档翻译: 3-3-4 管理文件
- 解决ngnix服务器上的Discuz!x2.5 Upload Error:413错误
- iOS8 Core Image In Swift:自动改善图像以及内置滤镜的使用
- Script of batch converting videos.
- 从Eclipse导入Android Studio的问题
- iOS中block使用注意事项
- didFailWithError: Error Domain=kCLErrorDomain Code=0 “The operation couldn’t be completed. (kCLError
- CSS实现提示框的效果
- spring Bean的生命周期