管理文件

这篇文档描述了Django为那些用户上传文件准备的文件访问API。底层的API足够通用,你可以使用为其它目的来使用它们。如果你想要处理静态文件(JS,CSS,以及其他),参见管理静态文件(CSS和图像)。

通常,Django使用MEDIA_ROOTMEDIA_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 管理文件相关推荐

  1. django 1.8 官方文档翻译:13-1-3 密码管理

    Django中的密码管理 密码管理在非必要情况下一般不会重新发明,Django致力于提供一套安全.灵活的工具集来管理用户密码.本文档描述Django存储密码和hash存储方法配置的方式,以及使用has ...

  2. django 1.8 官方文档翻译: 6-6-4 部署静态文件

    部署静态文件 另见 django.contrib.staticfiles 的用法简介,请参见管理静态文件(CSS.images). 在线上环境部署静态文件 放置静态文件到线上环境的基本步骤很简单:当静 ...

  3. django 1.8 官方文档翻译: 2-5-7 自定义查找

    自定义查找 New in Django 1.7. Django为过滤提供了大量的内建的查找(例如,exact和icontains).这篇文档阐述了如何编写自定义查找,以及如何修改现存查找的功能.关于查 ...

  4. django 1.8 官方文档翻译:8-5 加密签名

    加密签名 web应用安全的黄金法则是,永远不要相信来自不可信来源的数据.有时通过不可信的媒介来传递数据会非常方便.密码签名后的值可以通过不受信任的途径传递,这样是安全的,因为任何篡改都会检测的到. D ...

  5. django 1.8 官方文档翻译:13-6 分页

    分页 Django提供了一些类来帮助你管理分页的数据 – 也就是说,数据被分在不同页面中,并带有"上一页/下一页"标签.这些类位于django/core/paginator.py中 ...

  6. django 1.8 官方文档翻译: 2-5-1 管理器 (初稿)

    Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质. 交流群:467338606 网站:http://python.usyiyi.cn/django/index.html ...

  7. django 1.8 官方文档翻译: 2-5-1 管理器

    管理器 class Manager 管理器是一个接口,数据库查询操作通过它提供给django的模型.django应用的每个模型至少拥有一个 管理器. 管理器类的工作方式在 执行查询文档中阐述,而这篇文 ...

  8. django 1.8 官方文档翻译: 2-5-6 多数据库

    多数据库 这篇主题描述Django 对多个数据库的支持.大部分Django 文档假设你只和一个数据库打交道.如果你想与多个数据库打交道,你将需要一些额外的步骤. 定义你的数据库 在Django中使用多 ...

  9. django 1.8 官方文档翻译: 1-1-2 快速安装指南

    快速安装指南 在你开始使用 Django 之前,你需要先安装它.我们有一个 完整安装指南 它涵盖了所有的安装步骤和可能遇到的问题:本指南将会给你一个最简单.简洁的安装指引. 安装 Python 作为一 ...

最新文章

  1. mysql 之mvcc多版本控制
  2. 计算机专业408题目结构,2019考研408计算机组成原理知识:计算机系统层次结构
  3. java 通用对象_java中对所有对象都通用的方法
  4. php自写代码加密,加密解密:教你加密自己写的VBS代码
  5. Android 分析监听器上的参数position和id(二)
  6. 阿里云IoT规则引擎SQL参考
  7. MybatisPlus多表关联查询
  8. SpringBoot实现抽奖大转盘
  9. hdmi接口线_视频接口与视频线详解!
  10. 我写了个微信抽奖程序
  11. 住得越高越安静? 中间楼层噪音最大
  12. 用计算机弹EXO简谱,Power钢琴简谱-数字双手-EXO
  13. Python实现GWO智能灰狼优化算法优化支持向量机分类模型(SVC算法)项目实战
  14. Erebus以Linux勒索软件的方式重出江湖,勒索韩国公司100万美元
  15. PHP借用Redis消息队列实现高并发下发送邮件功能
  16. PyQt5_pyqtgraph股票SAR指标
  17. STM32 GPS悬停飞控 (三十五)树莓派 4g视频回传
  18. 腾讯WiFi码推广,扫码连WiFi小程序代理入驻后如何推广使用教程!
  19. 传感器自学笔记第五章——旋转编码器
  20. 牛客练习赛54(A,B,C(ATCG相同的分在一起 暴力加巧妙差分))

热门文章

  1. (3)FPGA面试技能提升篇(TCL脚本)
  2. matlab吧结果存数组,求助:如何将带有符号变量的运算结果储存到数组中
  3. java xmlutil_XmlUtil工具类(toxml()和toBean())
  4. python程序设计遇到的问题_Python程序设计与实践:用计算思维解决问题
  5. Linux中断(interrupt)子系统之三:中断流控处理层
  6. [计算机网络] - DNS基础介绍
  7. 基于平面 marker 的 Bundle Adjustmet
  8. QT5开发及实例学习之三字符串类
  9. .net mysql 多线程_.net线程详解(转)
  10. LeetBook《程序员的算法趣题》Q18---水果酥饼日