django 1.8 官方文档翻译: 3-3-4 管理文件
管理文件
这篇文档描述了Django为那些用户上传文件准备的文件访问API。底层的API足够通用,你可以使用为其它目的来使用它们。如果你想要处理静态文件(JS,CSS,以及其他),参见管理静态文件(CSS和图像)。
通常,Django使用MEDIA_ROOT
和 MEDIA_URL
设置在本地储存文件。下面的例子假设你使用这些默认值。
然而,Django提供了一些方法来编写自定义的 文件储存系统,允许你完全自定义Django在哪里以及如何储存文件。这篇文档的另一部分描述了这些储存系统如何工作。
在模型中使用文件
当你使用FileField
或者 ImageField
的时候,Django为你提供了一系列的API用来处理文件。
考虑下面的模型,它使用ImageField
来储存一张照片:
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
的实例都有一个 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_path
True
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.closed
True
>>> f.closed
True
在处理大量对象的循环中访问文件字段时,关闭文件极其重要。如果文件在访问之后没有手动关闭,会有消耗完文件描述符的风险。这可能导致如下错误:
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 models
from 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中的密码管理 密码管理在非必要情况下一般不会重新发明,Django致力于提供一套安全.灵活的工具集来管理用户密码.本文档描述Django存储密码和hash存储方法配置的方式,以及使用has ...
- django 1.8 官方文档翻译: 6-6-4 部署静态文件
部署静态文件 另见 django.contrib.staticfiles 的用法简介,请参见管理静态文件(CSS.images). 在线上环境部署静态文件 放置静态文件到线上环境的基本步骤很简单:当静 ...
- django 1.8 官方文档翻译: 2-5-7 自定义查找
自定义查找 New in Django 1.7. Django为过滤提供了大量的内建的查找(例如,exact和icontains).这篇文档阐述了如何编写自定义查找,以及如何修改现存查找的功能.关于查 ...
- django 1.8 官方文档翻译:8-5 加密签名
加密签名 web应用安全的黄金法则是,永远不要相信来自不可信来源的数据.有时通过不可信的媒介来传递数据会非常方便.密码签名后的值可以通过不受信任的途径传递,这样是安全的,因为任何篡改都会检测的到. D ...
- django 1.8 官方文档翻译:13-6 分页
分页 Django提供了一些类来帮助你管理分页的数据 – 也就是说,数据被分在不同页面中,并带有"上一页/下一页"标签.这些类位于django/core/paginator.py中 ...
- django 1.8 官方文档翻译: 2-5-1 管理器 (初稿)
Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质. 交流群:467338606 网站:http://python.usyiyi.cn/django/index.html ...
- django 1.8 官方文档翻译: 2-5-1 管理器
管理器 class Manager 管理器是一个接口,数据库查询操作通过它提供给django的模型.django应用的每个模型至少拥有一个 管理器. 管理器类的工作方式在 执行查询文档中阐述,而这篇文 ...
- django 1.8 官方文档翻译: 2-5-6 多数据库
多数据库 这篇主题描述Django 对多个数据库的支持.大部分Django 文档假设你只和一个数据库打交道.如果你想与多个数据库打交道,你将需要一些额外的步骤. 定义你的数据库 在Django中使用多 ...
- django 1.8 官方文档翻译: 1-1-2 快速安装指南
快速安装指南 在你开始使用 Django 之前,你需要先安装它.我们有一个 完整安装指南 它涵盖了所有的安装步骤和可能遇到的问题:本指南将会给你一个最简单.简洁的安装指引. 安装 Python 作为一 ...
最新文章
- mysql 之mvcc多版本控制
- 计算机专业408题目结构,2019考研408计算机组成原理知识:计算机系统层次结构
- java 通用对象_java中对所有对象都通用的方法
- php自写代码加密,加密解密:教你加密自己写的VBS代码
- Android 分析监听器上的参数position和id(二)
- 阿里云IoT规则引擎SQL参考
- MybatisPlus多表关联查询
- SpringBoot实现抽奖大转盘
- hdmi接口线_视频接口与视频线详解!
- 我写了个微信抽奖程序
- 住得越高越安静? 中间楼层噪音最大
- 用计算机弹EXO简谱,Power钢琴简谱-数字双手-EXO
- Python实现GWO智能灰狼优化算法优化支持向量机分类模型(SVC算法)项目实战
- Erebus以Linux勒索软件的方式重出江湖,勒索韩国公司100万美元
- PHP借用Redis消息队列实现高并发下发送邮件功能
- PyQt5_pyqtgraph股票SAR指标
- STM32 GPS悬停飞控 (三十五)树莓派 4g视频回传
- 腾讯WiFi码推广,扫码连WiFi小程序代理入驻后如何推广使用教程!
- 传感器自学笔记第五章——旋转编码器
- 牛客练习赛54(A,B,C(ATCG相同的分在一起 暴力加巧妙差分))
热门文章
- (3)FPGA面试技能提升篇(TCL脚本)
- matlab吧结果存数组,求助:如何将带有符号变量的运算结果储存到数组中
- java xmlutil_XmlUtil工具类(toxml()和toBean())
- python程序设计遇到的问题_Python程序设计与实践:用计算思维解决问题
- Linux中断(interrupt)子系统之三:中断流控处理层
- [计算机网络] - DNS基础介绍
- 基于平面 marker 的 Bundle Adjustmet
- QT5开发及实例学习之三字符串类
- .net mysql 多线程_.net线程详解(转)
- LeetBook《程序员的算法趣题》Q18---水果酥饼日