[Django 0-1] Core.Files

Core.Files 模块

Django 的核心模块之一,封装文件操作,提供对文件的上传、下载、删除、查看大小等功能。

提供的功能

  1. 存储后端解耦,支持多种存储后端,使得在不同存储后端中的文件数据都能以相同的方式操作
  2. 文件上传、下载、删除、查看大小等功能

支持的文件存储后端

  • FileSystemStorage:基于本地文件系统的存储后端,适用于开发环境和小型项目。
  • MemoryStorage:基于内存的存储后端,适用于开发环境,小型项目,处理一些临时文件。
第三方存储后端库
  • django-storages:支持 S3, LibCloud, Azure, DigitalOcean, Google Cloud Storage, Backblaze B2, SFTP, FTP, Dropbox, Oracle Cloud 等云存储服务。
  • django-oss-storage: 支持阿里云 OSS 对象存储服务, 可能已经失效但仍可以 fork 修改。
  • django-qiniu-storage: 支持七牛云对象存储服务, 可能已经失效但仍可以 fork 修改。

支持的文件类型

  • File:普通文件,可以是任何类型的文件,如图片、视频、文档等。
  • ImageFile:图片文件,继承自 File,提供图片处理的功能,也没什么功能就多了,height,width 两个方法,需要安装 Pillow 库。
  • UploadedFile: 抽象类,提供文件上传的基本功能,主要是满足 form-data 上传的文件。
  • TemporaryUploadedFile(继承自 UploadedFile): 存放在临时文件中
  • InMemoryUploadedFile(继承自 UploadedFile): 存储在内存中

可以学习的地方

  1. 自定义文件存储后端
class Storage:# 文件存储后端无关的接口,可以提供默认实现def open(self, name, mode="rb"): ...def save(self, name, content, max_length=None): ...def get_valid_name(self, name): ...def get_alternative_name(self, file_root, file_ext): ...def get_available_name(self, name, max_length=None): ...def generate_filename(self, filename): ...def path(self, name): ...# 与文件存储后端相关的接口,需要子类实现def _open(self, name, mode="rb"):raise NotImplementedError("subclasses of Storage must provide an _open() method")def delete(self, name):"""Delete the specified file from the storage system."""raise NotImplementedError("subclasses of Storage must provide a delete() method")def exists(self, name):"""Return True if a file referenced by the given name already exists in thestorage system, or False if the name is available for a new file."""raise NotImplementedError("subclasses of Storage must provide an exists() method")def listdir(self, path):"""List the contents of the specified path. Return a 2-tuple of lists:the first item being directories, the second item being files."""raise NotImplementedError("subclasses of Storage must provide a listdir() method")def size(self, name):"""Return the total size, in bytes, of the file specified by name."""raise NotImplementedError("subclasses of Storage must provide a size() method")def url(self, name):"""Return an absolute URL where the file's contents can be accesseddirectly by a web browser."""raise NotImplementedError("subclasses of Storage must provide a url() method")def get_accessed_time(self, name):"""Return the last accessed time (as a datetime) of the file specified byname. The datetime will be timezone-aware if USE_TZ=True."""raise NotImplementedError("subclasses of Storage must provide a get_accessed_time() method")def get_created_time(self, name):"""Return the creation time (as a datetime) of the file specified by name.The datetime will be timezone-aware if USE_TZ=True."""raise NotImplementedError("subclasses of Storage must provide a get_created_time() method")def get_modified_time(self, name):"""Return the last modified time (as a datetime) of the file specified byname. The datetime will be timezone-aware if USE_TZ=True."""raise NotImplementedError("subclasses of Storage must provide a get_modified_time() method")
  1. 文件读写锁

def _fd(f):"""Get a filedescriptor from something which could be a file or an fd."""return f.fileno() if hasattr(f, "fileno") else fif os.name == "nt":import msvcrtfrom ctypes import (POINTER,Structure,Union,WinDLL,byref,c_int64,c_ulong,c_void_p,sizeof,)from ctypes.wintypes import BOOL, DWORD, HANDLELOCK_SH = 0  # the defaultLOCK_NB = 0x1  # LOCKFILE_FAIL_IMMEDIATELYLOCK_EX = 0x2  # LOCKFILE_EXCLUSIVE_LOCK# --- Adapted from the pyserial project ---# detect size of ULONG_PTRif sizeof(c_ulong) != sizeof(c_void_p):ULONG_PTR = c_int64else:ULONG_PTR = c_ulongPVOID = c_void_p# --- Union inside Structure by stackoverflow:3480240 ---class _OFFSET(Structure):_fields_ = [("Offset", DWORD), ("OffsetHigh", DWORD)]class _OFFSET_UNION(Union):_anonymous_ = ["_offset"]_fields_ = [("_offset", _OFFSET), ("Pointer", PVOID)]class OVERLAPPED(Structure):_anonymous_ = ["_offset_union"]_fields_ = [("Internal", ULONG_PTR),("InternalHigh", ULONG_PTR),("_offset_union", _OFFSET_UNION),("hEvent", HANDLE),]LPOVERLAPPED = POINTER(OVERLAPPED)# --- Define function prototypes for extra safety ---kernel32 = WinDLL("kernel32")LockFileEx = kernel32.LockFileExLockFileEx.restype = BOOLLockFileEx.argtypes = [HANDLE, DWORD, DWORD, DWORD, DWORD, LPOVERLAPPED]UnlockFileEx = kernel32.UnlockFileExUnlockFileEx.restype = BOOLUnlockFileEx.argtypes = [HANDLE, DWORD, DWORD, DWORD, LPOVERLAPPED]def lock(f, flags):hfile = msvcrt.get_osfhandle(_fd(f))overlapped = OVERLAPPED()ret = LockFileEx(hfile, flags, 0, 0, 0xFFFF0000, byref(overlapped))return bool(ret)def unlock(f):hfile = msvcrt.get_osfhandle(_fd(f))overlapped = OVERLAPPED()ret = UnlockFileEx(hfile, 0, 0, 0xFFFF0000, byref(overlapped))return bool(ret)else:try:import fcntlLOCK_SH = fcntl.LOCK_SH  # shared lockLOCK_NB = fcntl.LOCK_NB  # non-blockingLOCK_EX = fcntl.LOCK_EXexcept (ImportError, AttributeError):# File locking is not supported.LOCK_EX = LOCK_SH = LOCK_NB = 0# Dummy functions that don't do anything.def lock(f, flags):# File is not lockedreturn Falsedef unlock(f):# File is unlockedreturn Trueelse:def lock(f, flags):try:fcntl.flock(_fd(f), flags)return Trueexcept BlockingIOError:return Falsedef unlock(f):fcntl.flock(_fd(f), fcntl.LOCK_UN)return True

总结

对于 web 服务端开发,文件操作是日常。但是文件的用途有很多,处置方式也很多。例如不同的文件类型放置在不同的存储后端,以及文件的访问控制、时效性也可以通过拓展存储后端来实现。
利用 django 这种分离文件操作和存储后端的框架,在开发中可以很好的解决大部分文件类需求。

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

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

相关文章

[云原生] Prometheus自动服务发现部署

一、部署服务发现 1.1 基于文件的服务发现 基于文件的服务发现是仅仅略优于静态配置的服务发现方式,它不依赖于任何平台或第三方服务,因而也是最为简单和通用的实现方式。 Prometheus Server 会定期从文件中加载 Target 信息,文件可使用 YAM…

华为认证云计算专家(HCIE-Cloud Computing)--判断题

华为认证云计算专家(HCIE-Cloud Computing)–判断题 1.(判断题)华为云stack支持鲲鹏架构,业务可从X86过渡到鲲鹏。 正确答案:正确 2.(判断题)业务上云以后,安全方面由云服务商负责,客户自己不需要做任何防…

使用Lua配置NeoVim

使用Lua配置NeoVim 源码地址依次添加插件视频地址 源码地址 Github: my-neovim-lua 依次添加插件 Lazy.nvim: nvim的插件管理器catpuccin: 舒缓柔和的主题插件telescope: 负责查找、过滤、预览treesitter: 基于语法树实现语法高亮neo-tree: 文件导航栏 。。。等待解锁更多 …

LLM(大语言模型)——Springboot集成文心一言、讯飞星火、通义千问、智谱清言

目录 引言 代码完整地址 入参 出参 Controller Service Service实现类 模型Service 入参转换类 文心一言实现类 讯飞星火实现类 通义千问实现类 智谱清言实现类 引言 本文将介绍如何使用Java语言,结合Spring Boot框架,集成国内热门大模型API&am…

Zabbix 监控 tomcat

zabbix-java-gateway服务组件 zabbix监控tomcat需要用到zabbix-java-gateway组件,它充当zabbix服务和java应用程序之间的网关。它允许zabbix服务器用过java网关与java应用程序进行通信,从而监控和收集java应用程序的性能数据。 zabbix-agent服务&#xf…

数据仓库原理(二)

目录 四、数据仓库的概念模型(一)多维数据模型(二)维度与粒度 五、数据仓库的逻辑模型(一)多维模型(二)星形模型(三)雪花模型 六、数据仓库的物理模型&#x…

如何使用IDE端通义灵码

如何使用IDE端通义灵码 第一步:安装IDE插件( VS Code 和 JetBrains 二选一) 如何下载安装VS Code :https://code.visualstudio.com 如何下载安装JetBrains:https://www.jetbrains.com/idea/download 第二步&#x…

CVPR2023 | 3D Data Augmentation for Driving Scenes on Camera

3D Data Augmentation for Driving Scenes on Camera 摄像机驾驶场景的 3D 数据增强 摘要翻译 驾驶场景极其多样和复杂,仅靠人力不可能收集到所有情况。虽然数据扩增是丰富训练数据的有效技术,但自动驾驶应用中现有的摄像头数据扩增方法仅限于二维图像…

Flutter 多语言自动化本地化生成器

Flutter 多语言自动化本地化生成器 这是一个为Flutter设计的插件,通过从Excel表格提取的CSV文件自动生成Dart本地化文件,以简化应用程序本地化的流程。这个工具通过自动化创建多语言资源文件,简化了开发人员和翻译人员的工作流程。 特点 默…

国外visa卡怎么办理,可充ChatGPTPLUS、Claude、Midjourney

很多小伙都在使用ChatGPT,但是想充值ChatGPTPLUS缺需要国外的visa卡,拿自己的银联卡,尝试了好多次还是不行,其实用一张国外的visa卡几分钟就可以升级好 办理国外visa卡,点击获取 国外的visa卡,具体要看你…

实现两栏布局

1. 利用浮动 将左边元素宽度设为200px,并设置向左浮动将右边元素的margin-left设为200px,宽度为auto(默认为auto,撑满整个父元素) .outer {height: 100px; } .left {float: left;width: 200px; } .right {margin-lef…

ORM Bee数据源的使用, Bee有自己的数据源吗?

Bee实现了几种简单的数据源,用于开发/测试; 生产上一般都是选用性能比较好的数据源工具,Bee内置实现的,主要是为了方便开发/测试; 1. SimpleDataSource 参考: 参考bee-exam工程,I nitSameDsUtil.DruidDa…

springboot配置文件Tomcat和mvc详细配置

tomcat相关配置参数 (ServerProperties) server.port8080 server.address # bind to a specific NIC server.session-timeout # session timeout in seconds server.context-path # the context path, defaults to ‘/’ server.servlet-path # the servlet path, defaults to…

ArcGIS全系列实战视频教程——9个单一课程组合+系列直播回放

《ArcGIS全系列实战视频教程》是由9个单一课程组合合成。组成一条ArcGIS入门实战各项专题深入应用学习全链条,让你学有方向、学有目的,系统全面掌握ArcGIS。 ArcGIS全系列实战视频教程——9个单一课程组合https://edu.csdn.net/combo/detail/2569 《Ar…

SpringBoot之Bean扫描、Bean注册

目录 Bean扫描 Bean注册 Bean lmport 自定义注解 注册条件 Bean扫描 Bean扫描有两种方式 1、标签:<context:component-scan base-package"com.mybatis"/> 2、注解: ComponentScan(basePackages "com.mybatis") springboot启动类注解可以自…

HTML世界之input标签

<input> 元素在 <form> 元素中使用&#xff0c;用来声明允许用户输入数据的 input 控件。 <input> 元素是空的,它只包含标签属性&#xff0c;规定了用户可以在其中输入数据的输入字段。输入字段可通过多种方式改变&#xff0c;取决于 type 属性。 属性 值 …

Postman定义全局变量和环境

Postman定义全局变量和环境 一. 问题二. 配置环境解决 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一. 问题 问题前因&#xff1a;在使用postman调用elasticsearch接口的时候&…

目标检测——YOLOv3算法解读

论文&#xff1a;YOLOv3&#xff1a;An Incremental Improvement 作者&#xff1a;Joseph Redmon, Ali Farhadi 链接&#xff1a;https://arxiv.org/abs/1804.02767 代码&#xff1a;http://pjreddie.com/yolo/ YOLO系列其他文章&#xff1a; YOLOv1通俗易懂版解读SSD算法解读…

rust学习(简单链表)

编写一个简单链表&#xff0c;主要遇到的问题就是next指针&#xff08;按照C的写法&#xff09;的数据如何定义。按照网上的建议&#xff0c;一般定义如下&#xff1a; struct Node {pub value:u32,pub next:Option<Rc<RefCell<Node>>>, //1 }1.用Option主要…

pearlCTF——少部分WP

题型新颖&#xff0c;见识了不少 目录 b4by_jailExcel MayhemRick Roll3 spiesjail_timeWiFi brokenSoundScape b4by_jail 一道沙箱逃逸的题 源代码 #!/usr/local/bin/python import time flag"pearl{f4k3_fl4g}" blacklistlist("abcdefghijklmnopqrstuvwxyz…