讲讲django的文件对象

news/2025/11/30 23:32:23/文章来源:https://www.cnblogs.com/xiaojp65536/p/19290816

一、django文件对象是什么?

Django 抽象出了一套“文件处理体系”,核心是:

  • Django 所有文件类的基类
  • 提供统一的接口用于:
    • 读取

    • 写入

    • 迭代

    • 存储到 Storage 后端(本地/OSS/S3)

使用FileField / ImageField来构造:

class MyModel(models.Model):file = models.FileField(upload_to='files/')

这个字段对文件内容不做存储,只存储 文件路径字符串

真正的文件保存由:

  • django.core.files.File

  • 一套 Storage(默认本地文件系统)

obj.file.save('result.txt', ContentFile('hello world'))

此时 Django 会:

  1. 把 ContentFile 写入本地或 OSS 或 S3

  2. 把保存后的路径写到数据库字段 file

二、不同场景下该用哪种 Django 文件对象

场景 1:用户上传文件(常见 Web/DRF)

def upload(request):f = request.FILES['file']  # InMemoryUploadedFile 或 TemporaryUploadedFileprint(f.name, f.size, f.content_type)

场景 2:动态生成一个文件(如 CSV/JSON/图片),并保存到 FileField

from django.core.files.base import ContentFilecontent = "name,age\nTom,18\nJerry,20"
obj.file.save("data.csv", ContentFile(content))

场景 3:用 Python open 打开的本地文件,写入 FileField

from django.core.files import Filewith open('local.txt', 'rb') as f:obj.file.save('copy.txt', File(f))

三、几种文件存储的对应配置

1.本地存储:我就想存到服务器磁盘

Django 默认就是本地磁盘文件存储,用的类是:

DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'

settings.py 里:

import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))MEDIA_ROOT = os.path.join(BASE_DIR, 'media')  # 真实文件保存路径
MEDIA_URL = '/media/'                         # 浏览器访问前缀

模型配置:

class MyModel(models.Model):file = models.FileField(upload_to='uploads/')

最后

obj.file.save('a.txt', ContentFile('hello'))

实际效果是:

  • 文件会被保存到:MEDIA_ROOT / uploads / a.txt
  • 例如:/project_root/media/uploads/a.txt
  • 数据库里的字段只保存相对路径:uploads/a.txt
  • 浏览器访问地址是:MEDIA_URL + 'uploads/a.txt'/media/uploads/a.txt

访问文件,只需要在url.py加一个静态路由:

from django.conf import settings
from django.conf.urls.static import staticurlpatterns = [# ... 你的其他 URL
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

2.上云存储:S3/OSS/COS/BOS 等

1)用现成库(如 django-storages + S3 为例),需要安装:

pip install django-storages boto3

settings.py配置:

INSTALLED_APPS = [# ...'storages',
]DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'AWS_ACCESS_KEY_ID = '你的Key'
AWS_SECRET_ACCESS_KEY = '你的Secret'
AWS_STORAGE_BUCKET_NAME = '你的bucket名字'
AWS_S3_ENDPOINT_URL = 'https://s3.amazonaws.com'  # 若用其他云厂商,写他们给的S3兼容endpoint
MEDIA_URL = 'https://你的bucket域名/'   # 访问 URL 前缀

模型不需要改动:

class MyModel(models.Model):file = models.FileField(upload_to='files/')

业务代码:

obj.file.save('a.txt', ContentFile('hello cloud'))

Django 会:

  • 把文件内容通过 S3 API 上传到你的 bucket:files/a.txt
  • 数据库字段还是保存 files/a.txt
  • 页面访问路径是:MEDIA_URL + 'files/a.txt',比如:https://your-bucket.xxx.com/files/a.txt

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/982369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

香港中文大学(深圳) PHY1001 - Mechanics 笔记

笔记包括2025年秋学期该课程的知识点笔记包括2025年秋学期该课程的知识点 不包含高中物理中有的一些常见知识点Idealized Models 理想模型 为了研究最重要的性质而建立的比现实简单的模型,如研究物体下落轨迹时会忽略…

P9606 ABB

点击查看代码 #include<bits/stdc++.h>using namespace std;const int N=8e5+10; char str[N]; int ne[N];int main() {int n;string s;cin>>n>>s;//构造反转拼接字符串for(int i=0;i<n;i++){str…

微PE的磁盘化启动:不再使用WEPE64.WIM,直接从分区启动PE系统!

微PE的磁盘化启动:不再使用WEPE64.WIM,直接从分区启动PE系统 我们曾经学习过,PE系统的启动模式是Ramdisk.这是一种通过将内存虚拟成一块磁盘分区的方式启动的模式. (具体内容详见我的第25篇文章:《25Ramdisk 启动模式简…

73 Windows系统磁盘与分区知识详解

Windows系统磁盘与分区知识详解 在日常使用Windows操作系统的过程中,我们常常会接触到磁盘管理,磁盘分区等操作.然而,许多人可能并不完全理解磁盘和分区的运作原理以及如何高效管理它们. 本篇文章将探讨Windows系统中关…

不说废话,硬核干货:重装系统方法大总结!

不说废话,硬核干货:重装系统方法大总结! 重装系统到底有多少种方法?每种方法都怎么操作?本文列举出所有可行的重装系统方法,不讲原理,就是实操! 任何新系统的产生,都是依赖于它之前的系统.使用ISO直接装系统 我们从微…

isnumeric() 和 isdigit() 的区别

在 Python 中,isnumeric() 和 isdigit() 都是字符串方法,用于检查字符串中的字符是否属于特定类别(如数字)。虽然它们功能相似,但在处理某些字符时存在区别。以下是主要差异和适用场景:1. isdigit()定义:检查字…

109 C盘又变红了?清理C盘的便捷方法!

C盘又变红了?清理C盘的便捷方法! C 盘空间不足,是大多数 Windows 用户的“常见病”。当系统盘告急,不仅影响软件安装和系统更新,还可能拖慢整机速度。今天,我们就以“细致、系统、易上手”为原则全面清理 C 盘,让…

79 对系统迁移几种方案的经验之谈

对系统迁移几种方案的经验之谈声明: 本文由@CDsidi大佬所作,感谢CDsidi大佬为公众号贡献技术文章!!!最近笔记本电脑硬盘空间不够用了,于是打算换一个新硬盘,把原来的旧硬盘换下来.为了保持使用习惯的连续性,决定采用全…

108 彻底卸载Windows Defender的开源小工具

彻底卸载Windows Defender的开源小工具 在 Windows 系统中,内置的 Windows Defender(微软安全中心)虽然能够提供基本防护,但在某些场景下会影响性能或与第三方安全/虚拟化软件产生冲突。对于需要彻底移除或禁用 De…

梅德乐:从愿景到实践的十七载坚守

在广州番禺区的某栋科研楼内,凌晨两点仍亮着灯的实验室里,梅德乐的科研团队正为一位县级医院内科医师的论文做最后的数据验证。这是梅德乐十七年来的日常缩影:从2009年成立至今,这家专注于生物医学科研转化的企业,…

【UEFI实战】在库中使用全局变量

说明 本文涉及的代码都可以在vUDK2017: https://github.com/tianocore/edk2.git Tag vUDK2017.中找到。 一个不怎么好的测试代码 有两个驱动,NullDxeDriverOne.inf和NullDxeDriverTwo.inf,它们做的事情只有一件,就是…

107 如何快速保存和恢复文件的默认打开方式?

如何快速保存和恢复文件的默认打开方式? 我们每次重装系统之后,都要重新设置文件的默认打开方式还有默认应用,十分繁琐复杂. 为了防止误操作或系统重装后丢失已自定义的文件默认打开方式,本文将介绍如何借助 DISM 工…

90 老牌压缩软件,性能强大,开源免费!

老牌压缩软件,性能强大,开源免费! 今天向大家推荐一款经典且实用的压缩软件. 作为一款老牌的开源压缩工具,7-Zip不仅功能全面,而且完全免费,深受广大用户的喜爱。 如果你还没有体验过它,今天就一起来了解一下,为…

95 为什么越来越多的人不再使用eD2k了?回顾电驴的兴与衰

为什么越来越多的人不再使用eD2k了?回顾电驴的兴与衰 如果你在秋名山身经百战,那么一定会知道“电驴”这个词。在很多人的印象中,这是一度非常流行的下载软件,所使用的是“eD2k”开头的专有下载链接。但是近几年,…

155 重装系统电脑循环重启?问题大概率出现在这里!

重装系统电脑循环重启?问题大概率出现在这里! 每当我们心中满怀美好期许,在PE里面使用工具重装好系统,点击重新启动之后,经过漫长的等待,却发现电脑总是循环重启,卡死在Windows蓝色logo或品牌机logo并不断转圈的界面,…

89 WindowsPE系统浅谈与PE系统推荐

WindowsPE系统浅谈与PE系统推荐 在Windows操作系统的家族中,Windows PE(Preinstallation Environment)是一个非常重要的工具.它主要用于操作系统的部署、维修和故障排除. 今天,我们将一起深入了解Windows PE系统的特…

42 winntsetup版本更新

winntsetup版本更新 ! ! ! winntsetup.exe作为一个老牌的Windows系统第三方安装器,几乎是所有PE系统的必备工具之一.但是很多朋友苦于无法找到它的官方下载网站,不能及时把它更新到最新版本. 今天作者提供winntsetup.e…

138 Windows安装程序无法将Windows配置为在此计算机的硬件上运行的解决办法

"Windows安装程序无法将Windows配置为在此计算机的硬件上运行"的解决办法 安装Windows时遇到“Windows安装程序无法将Windows配置为在此计算机的硬件上运行”的错误提示时,可能是由于硬件兼容性或系统设置问…

121 如何无损转换分区表类型?其实并不是单向的!

如何无损转换分区表类型?其实并不是单向的! 在BIOS和UEFI两种固件的更替过程中我们经常需要进行的操作是更改磁盘分区表类型.很多朋友认为,磁盘分区表的转换只能是单向的,只能是GPT转换为MBR分区表. 实际上,并不是这样…

手搓BIOS+UEFI双启动PE启动盘

手搓BIOS+UEFI双启动PE启动盘 在读本文之前,强烈建议你阅读我的第26篇:《番外1 对PE启动U盘的思考》.本文在这个基础上继续. 想要达到BIOS+UEFI双启动的目的,我们需要思考:U盘的分区表类型应该是什么? U盘的分区结构应…