当前位置: 首页 > news >正文

Python web实战之Django的文件上传和处理详解

     

 


概要

关键词:Python Web开发、Django、文件上传、文件处理

今天分享一下Django的文件上传和处理。

1. 上传文件的基本原理

在开始深入讲解Django的文件上传和处理之前,先了解一下文件上传的基本原理。当用户选择要上传的文件后,该文件会被发送到服务器端,并存储在服务器的某个位置上。我们需要在服务器端对这些上传的文件进行处理,例如存储到数据库中、生成缩略图、验证文件类型等等。

1.1 Django的文件上传流程简介

在Django中,文件上传的流程可以简单概括为以下几个步骤:

  1. 用户在网页上选择要上传的文件,并点击上传按钮。

  2. 前端将文件发送给后端服务器。

  3. Django后端接收到文件并保存到指定的位置。

  4. 根据需求对文件进行处理,如存储到数据库、生成缩略图等。

  5. 返回上传结果给用户。

2. Django文件上传的实现步骤

2.1 设置文件上传配置

首先在settings.py文件中找到MEDIA_ROOTMEDIA_URL两个配置项。MEDIA_ROOT指定了文件上传后的存储路径,而MEDIA_URL则是文件在网页中的访问路径。

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

2.2 编写文件上传表单

然后在前端编写一个文件上传表单。在Django中,可以使用forms模块来方便地创建表单。

文件上传表单示例:

from django import formsclass UploadFileForm(forms.Form):file = forms.FileField()

2.3 处理文件上传请求

当用户提交文件上传表单后,我们需要在后端处理文件上传的请求。在Django中,可以使用视图函数来处理请求。

处理文件上传的视图函数示例:

from django.shortcuts import render
from .forms import UploadFileFormdef upload_file(request):if request.method == 'POST':form = UploadFileForm(request.POST, request.FILES)if form.is_valid():file = form.cleaned_data['file']# 在这里对文件进行处理,如保存到指定位置、生成缩略图等# ...return render(request, 'upload_success.html')else:form = UploadFileForm()return render(request, 'upload.html', {'form': form})

2.4 处理上传的文件

在视图函数中,我们可以通过request.FILES获取到上传的文件对象。接下来,我们可以根据需求对文件进行处理,例如保存到指定位置、生成缩略图等。

简单的文件保存示例:

import os
from django.conf import settings
from django.shortcuts import render
from .forms import UploadFileFormdef upload_file(request):if request.method == 'POST':form = UploadFileForm(request.POST, request.FILES)if form.is_valid():file = form.cleaned_data['file']# 将文件保存到指定位置with open(os.path.join(settings.MEDIA_ROOT, file.name), 'wb') as destination:for chunk in file.chunks():destination.write(chunk)return render(request, 'upload_success.html')else:form = UploadFileForm()return render(request, 'upload.html', {'form': form})

2.5 文件上传成功页面

最后,我们需要为文件上传成功后的页面创建一个模板。在这个模板中,我们可以展示上传成功的信息,或者提供其他操作选项。

简单的文件上传成功页面示例:

<!-- upload_success.html -->
<!DOCTYPE html>
<html>
<head><title>文件上传成功</title>
</head>
<body><h1>文件上传成功!</h1><!-- 在这里添加其他内容或操作选项 -->
</body>
</html>

2.6 阿里云OSS文件上传

除了本地文件系统,我们还可以将上传的文件存储到云存储服务中,例如阿里云的对象存储服务(OSS)。在Django中,使用阿里云OSS进行文件上传非常简单。

2.6.1 安装阿里云Python SDK

首先,我们需要安装阿里云Python SDK,它提供了与阿里云各项服务交互的功能。在终端中执行以下命令进行安装:

pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-oss2

2.6.2 配置阿里云OSS

在使用阿里云OSS之前,我们需要先进行配置。在settings.py文件中添加以下配置项:

ALIYUN_ACCESS_KEY_ID = 'your_access_key_id'
ALIYUN_ACCESS_KEY_SECRET = 'your_access_key_secret'
ALIYUN_OSS_ENDPOINT = 'your_oss_endpoint'
ALIYUN_OSS_BUCKET_NAME = 'your_bucket_name'

在这里,你需要将your_access_key_idyour_access_key_secret替换为你的阿里云Access Key ID和Access Key Secret。your_oss_endpoint是你的OSS服务的访问域名,your_bucket_name是你创建的存储桶名称。

2.6.3 编写阿里云OSS文件上传函数

接下来编写一个函数来实现将文件上传到阿里云OSS的功能。

示例:

import oss2
from django.conf import settingsdef upload_to_oss(file):auth = oss2.Auth(settings.ALIYUN_ACCESS_KEY_ID, settings.ALIYUN_ACCESS_KEY_SECRET)bucket = oss2.Bucket(auth, settings.ALIYUN_OSS_ENDPOINT, settings.ALIYUN_OSS_BUCKET_NAME)# 生成一个随机的文件名filename = oss2.utils.to_string(os.urandom(8)).encode('hex') + os.path.splitext(file.name)[1]# 上传文件到阿里云OSSbucket.put_object(filename, file)# 返回文件在OSS中的访问URLreturn f'https://{settings.ALIYUN_OSS_BUCKET_NAME}.{settings.ALIYUN_OSS_ENDPOINT}/{filename}'

在这个函数中,我们首先使用Access Key ID和Access Key Secret创建一个Auth对象,并指定OSS服务的访问域名和存储桶名称。然后,我们生成一个随机的文件名,并调用bucket.put_object方法将文件上传到OSS中。

最后,获取返回文件在OSS中的访问URL,保存到数据库,供后续使用。

2.6.4 调用阿里云OSS文件上传函数

在视图函数中,可以调用上述编写的阿里云OSS文件上传函数,将文件上传到阿里云OSS。

示例:

def upload_file(request):if request.method == 'POST':form = UploadFileForm(request.POST, request.FILES)if form.is_valid():file = form.cleaned_data['file']# 将文件上传到阿里云OSSoss_url = upload_to_oss(file)# 在这里可以对上传成功的文件进行其他操作# ...return render(request, 'upload_success.html', {'oss_url': oss_url})else:form = UploadFileForm()return render(request, 'upload.html', {'form': form})

3. 技术总结

本文介绍了Django框架中文件上传和处理的基本原理和实现方法,以及阿里云oss的对接方法。

Django 提供了一些内置的功能和工具,使文件上传变得简单和安全。它提供了一个处理文件上传的高级 API,可以验证上传的文件、处理文件存储路径、限制文件大小和类型,以及执行其他与文件操作相关的任务。

使用阿里云OSS可以方便地将文件存储在云端,并提供高可用性和可靠性。这种集成可以帮助我们在Django项目中实现灵活的文件上传功能。

如果文章对你有所帮助,欢迎点赞收藏转发,感谢!!

相关文章:

Python web实战之Django的文件上传和处理详解

概要 关键词&#xff1a;Python Web开发、Django、文件上传、文件处理 今天分享一下Django的文件上传和处理。 1. 上传文件的基本原理 在开始深入讲解Django的文件上传和处理之前&#xff0c;先了解一下文件上传的基本原理。当用户选择要上传的文件后&#xff0c;该文件会被发…...

android res中values-swxxdp计算

一. res中values-swxxdp计算 以四寸中控面板为例 通过adb shell wm size获取屏幕大小为1264x1680 通过adb shell wm density获取屏幕显示密度dpi为300 最小宽度计算方法&#xff1a;s w 160 ∗ 手机宽度像素 / d p i sw160*手机宽度像素/dpisw160∗手机宽度像素/dpi 过公式…...

c动态内存申请

动态分配内存概述 先说数组的长度是预定义好的&#xff0c;固定不变的。但是呢&#xff0c;实际上所需的内存空间取决于实际输入的数据&#xff0c;而无法预先确定。所以根据实际情况&#xff0c;推出了内存管理函数。这些内存管理函数可以按需要动态分配内存空间&#xff0c;…...

C#8.0本质论第一章--C#概述

C#8.0本质论第一章–C#概述 朋友推荐的一本讲C#的书–C#本质论&#xff0c;英文叫Essential C#&#xff0c;官网可以免费看英文版的https://essentialcsharp.com/home。 C#可以为各种不同的系统平台开发应用软件和程序组件&#xff0c;支持移动设备&#xff0c;游戏主机&…...

geoserver编辑样式 【开发工具QGis的初次使用】

geoserver编辑样式 开发工具配置中文语言 geoserver样式的更改 开发工具 链接: geoserver样式style的更改 链接: QGis开发工具的安装及使用 配置中文语言 setting > options > general > 中文 geoserver样式的更改 链接: geoserver样式style的更改 利用QGIs Q…...

【网络基础知识铺垫】

文章目录 1 :peach:计算机网络背景:peach:1.1 :apple:网络发展:apple: 2 :peach:协议:peach:2.1 :apple:协议分层:apple:2.2 :apple:OSI七层模型:apple:2.3 :apple:TCP/IP模型:apple:2.4 :apple:TCP/IP模型与操作系统的关系:apple: 3 :peach:网络传输基本流程:peach:4 :peach:网…...

一个利用oracle异常处理的函数

函数主体如下&#xff1a; CREATE OR REPLACE FUNCTION fn_get_agmt_bal(p_agmt_no varchar2) RETURN NUMBER ISv_bal NUMBER : 0;--在SQL/PLUS中执行时&#xff0c;若合dbms_output生效&#xff0c;需先执行【SET SERVEROUTPUT ON】; BEGINselect agmt_balinto v_balfrom edw…...

langchain-ChatGLM源码阅读:参数设置

文章目录 上下文关联对话轮数向量匹配 top k控制生成质量的参数参数设置心得 上下文关联 上下文关联相关参数&#xff1a; 知识相关度阈值score_threshold内容条数k是否启用上下文关联chunk_conent上下文最大长度chunk_size 其主要作用是在所在文档中扩展与当前query相似度较高…...

什么是Java中的工厂模式?

工厂模式&#xff08;Factory Pattern&#xff09;是一种常见的设计模式&#xff0c;它可以帮助我们简化对象创建的过程&#xff0c;将对象的创建与使用分离&#xff0c;提高代码的可维护性和可扩展性。在Java中&#xff0c;工厂模式通常分为简单工厂模式&#xff08;Simple Fa…...

数据库--MySQL

一、什么是范式&#xff1f; 范式是数据库设计时遵循的一种规范&#xff0c;不同的规范要求遵循不同的范式。 最常用的三大范式 第一范式(1NF)&#xff1a;属性不可分割&#xff0c;即每个属性都是不可分割的原子项。(实体的属性即表中的列) 第二范式(2NF)&#xff1a;满足…...

浏览器多管闲事之跨域

年少时的梦想就是买一台小霸王游戏机 当时的宣传语就是小霸王其乐无穷~。 大些了&#xff0c;攒够了零花钱&#xff0c;在家长的带领下终于买到了 那一刻我感觉就是最幸福的人 风都是甜的&#xff01; 哪成想... 刚到家就被家长扣下了 “”禁止未成年人玩游戏机 (问过卖家了&a…...

那为什么 async 函数最终返回的是一个新的 Promise?

async 函数的设计就是这样的&#xff1a;无论你返回什么值&#xff0c;它都会自动被包装为一个 Promise 对象。这就是为什么说 async 函数最终返回的是一个新的 Promise 对象。 当你在 async 函数中使用 return 语句返回一个值时&#xff0c;这个值会成为最终返回的 Promise 对…...

Java的泛型

泛型 泛型又称参数化类型&#xff0c;是Jdk5.0出现的新特性,解决数据类型的安全性问题 在类声明或实例化时只要指定好需要的具体的类型即可 Java泛型可以保证如果程序在编译时没有发出警告&#xff0c;运行时就不会产生ClassCastException异常。同时&#xff0c;代码更加简洁…...

pve和openwrt以及我的电脑中网络的关系和互通组网

情况1 一台主机 有4个口&#xff0c;分别eth0,eth1,eth2,eth3 pve有管理口 这个情况下 &#xff0c;没有openwrt 直接电脑和pve管理口连在一起就能进pve管理界面 情况2 假设pve 的管理口味eth0 openwrt中桥接的是eth0 eth1 eth2 那么电脑连接eth3或者pve管理口设置eth3&#xf…...

TypeScript学习笔记

1.ts和js的区别 2. ts的优势 3. ts下载后报错解决方法 报错: PS C:\Users\\Desktop> tsc -v tsc : 无法加载文件 C:\Users\32173\AppData\Roaming\npm\tsc.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/ go.microsoft.com/fwlink/?…...

MATLAB实现两组数据的延时对齐效果

博主在某次实验中&#xff0c;相同的实验条件下分别采集了两组数据&#xff0c;发现两组数据存在一个延时&#xff0c;如下图所示&#xff1a; 本文记录消除这个延时&#xff0c;实现相同数据状态的对齐效果&#xff0c;采用MATLAB自带的xcorr函数实现&#xff0c;具体步骤如下…...

基于Spring Boot的网络在线学习网站的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的网络在线学习网站的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java spri…...

Is a directory: ‘outs//.ipynb_checkpoints‘

提示out/文件夹的.ipynp_chechpoints是一个文件夹&#xff0c;但是打开文件夹却没有看到&#xff0c;可以得知他是一个隐藏文件夹&#xff0c;进入outs/文件夹&#xff0c;使用 ls -a可以看到所有文件 果然出现这个文件夹&#xff0c;但是我们这个outs/文件夹存放的是图片&am…...

PintOS lab2 User Programs 实验记录

Background 大体流程如下图所示&#xff0c;显然这时候start_process无法被调度到。 然后start_process 里面load .out文件 &#xff08;.o文件就是对象文件,是可重定向文件的一种,通常以ELF格式保存&#xff0c;里面包含了对各个函数的入口标记&#xff0c;描述&#xff0c;…...

『CV学习笔记』docker和nvidia-docker离线安装

docker和nvidia-docker离线安装 文章目录 1. docker的deb包下载链接2. nvidia-docker 的deb包下载3. 重启 docker4. 检验安装5. Docker容器命令行不支持Tab键命令自动补全6. 参考文献这里是ubuntu操作系统, 如果是其他的操作系统,则需要安装对应的deb包1. docker的deb包下载链…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...