Django静态文件媒体文件文件上传
文章目录
- 一、静态文件和媒体文件
- 1.在django中使用静态文件
- 实践
- 2.在django中使用媒体文件
- 二、文件上传
- 单文件上传
- 实践
- 多文件上传
一、静态文件和媒体文件
媒体文件: 用户上传的文件,叫做media
静态文件:存放在服务器的css,js,image,font等 叫做static
1.在django中使用静态文件
1)首先确保django.contrib.staticfiles在 INSTALLED_APPS中
2)在settings中定义STATIC_URLSTATIC_URL = '/static/'
3)在你app的static目录中存放静态文件,比如App/static/example.jpg
4)如果有别的静态资源文件,不在app下的static目录下,可以通过STATICFILES_DIRS来指定额外的静态文件搜索目录。STATICFILES_DIRS = [os.path.join(BASE_DIR, "static"),...]
5)在模板中使用load标签去加载静态文件{% load static %}<img src="{% static "App/example.jpg" %}" />
实践
创建一个新项目 Day06DjangoPro01

每一个应用中都可以新建一个static和templates

如果想要额外再加一些静态文件路径,就再加一个STATICFILES_DIRS

App\templates\index.html
一般用<link rel="stylesheet" href="{% static 'css/index.css' %}">
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>使用静态文件</title>{% load static %}
{# <link rel="stylesheet" href="/static/css/index.css">#}<link rel="stylesheet" href="{% static 'css/index.css' %}"></head>
<body>
<h2>使用静态文件</h2>
<hr></body>
</html>
App\static\css\index.css
h2 {color: #7FFF00FF;
}
根路由Day06DjangoPro01\urls.py
from django.contrib import admin
from django.urls import path
from App.views import *urlpatterns = [path('admin/', admin.site.urls),path('index/', index),
]
App\views.py
from django.shortcuts import render# 静态文件的使用
def index(request):return render(request, 'index.html')

在项目根目录下的static和templates 也是可以这样用的
2.在django中使用媒体文件
在settings中配置 MEDIA_ROOTMEDIA_ROOT = os.path.join(BASE_DIR, "media")
二、文件上传
单文件上传
文件上传要求form表单存在enctype="multipart/form-data"属性,并且提交方法是post。<form enctype="multipart/form-data" action="/uploadFile/" method="post"><input type="file"name="myfile" /><br/><input type="submit" value="upload"/></form>最简单的文件上传:
def file_upload(request):if request.method =='POST':# 获取上传的文件,如果没有文件,则默认为NonemyFile = request.FILES.get( 'myfile', None)if not myFile:return HttpResponse("no files for upload")file_path = os.path.join(settings.MEDIA_ROOT, '1.jpg')with open(file_path, 'ab') as fp:for part in myFile.chunks():fp.write(part)return HttpResponse("上传成功!")else:return render(request,'index.html')
实践
在settings中配置 MEDIA_ROOT
# 媒体文件
MEDIA_ROOT = BASE_DIR / 'static/upload'

templates\upload1.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h2>单文件上传</h2><form action="" enctype="multipart/form-data" method="post">{% csrf_token %}用户名:<input type="text" name="username"><br>头像:<input type="file"name="icon" /><br/><button>上传图片</button></form>
</body>
</html>
App\models.py
from django.db import models# 用户
class UserModel(models.Model):# 名字name = models.CharField(max_length=30, unique=True)# 头像icon = models.CharField(max_length=255)
写完之后记得做迁移
生成迁移文件: python manage.py makemigrations
执行迁移: python manage.py migrate
App\views.py
import os
import uuidfrom django.conf import settingsfrom django.shortcuts import render# 上传文件:媒体文件
# 单文件上传
from App.models import UserModeldef upload1(request):if request.method == 'GET':return render(request, 'upload1.html')elif request.method == 'POST':# 单文件上传username = request.POST.get('username')icon = request.FILES.get('icon') # 只有一个文件用get()print(icon, type(icon)) # 文件对象# picture3.jpg <class 'django.core.files.uploadedfile.TemporaryUploadedFile'>print(icon.name) # picture3.jpg# 1. 将上传的图片存储到后端对应的媒体文件夹中# file_name = icon.name # 图片名称尽量不要使用原图名称# file_name = gen_uuid_name() + icon.name[icon.name.rfind('.'):] # icon.name.rfind('.') 获得最后一个.的下标, 拿到的是 .jpgfile_name = gen_uuid_name() + os.path.splitext(icon.name)[-1] # os.path.splitext得到的是一个数组,取最后一个, 拿到的是 .jpg# 后面可以加个时间戳file_path = os.path.join(settings.MEDIA_ROOT, file_name) # settings.py 设置的文件路径 MEDIA_ROOTprint('file_path', file_path) # D:\xxx\pythonCode\Django学习\code\Day06DjangoPro01\static\upload\picture3.jpg# 分段写入文件with open(file_path, 'ab') as fp: # ab 追加写的方式for part in icon.chunks(): # icon.chunks()方法 会一段一段的取,直到你取完为止,考虑到上传视频很大的话,一次性取会占很大一块内存,所以分段取fp.write(part)fp.flush() # 写一段,清空一次缓存# 如果要把用户的图片存起来,不是直接把图片的二进制存起来,虽然可以存二进制,但是我们一般不存二进制# 2. 存到本地。将该媒体文件的路径 存入到数据库中。因为图片视频的二进制都比较大,如果存二进制到数据库会很大user = UserModel()user.name = usernameuser.icon = 'upload/' + file_nameuser.save() # 保存return render(request, 'upload1.html')# 得到一个图片名称(通过uuid来得到唯一的图片名称)
def gen_uuid_name():return str(uuid.uuid4()) # 它会根据我们的时间还有随机数之类的东西去生成唯一的字符串
urls.py
# 上传文件
path('upload1/', upload1),
浏览器http://127.0.0.1:8000/upload1/


可以看到上传成功啦!!!
多文件上传
App\models.py
# 相册
class PhotoModel(models.Model):img = models.CharField(max_length=255) # 图片地址# 图片所属用户user = models.ForeignKey(UserModel, on_delete=models.PROTECT) # 每一个照片只属于一个用户,一对多关系
写完之后记得做迁移
生成迁移文件: python manage.py makemigrations
执行迁移: python manage.py migrate
templates\upload2.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h2>多文件上传</h2>{# enctype="multipart/form-data" : 支持文件上传 #}{# multiple: 支持文件多选 #}<form action="" enctype="multipart/form-data" method="post">{% csrf_token %}用户id:<input type="text" name="userid"><br>请选择要上传的照片:<input type="file" name="imgs" multiple /><br/><button>上传图片</button></form>
</body>
</html>
App\views.py
import os
import uuidfrom django.conf import settingsfrom django.shortcuts import render
from App.models import *# 多文件上传
def upload2(request):if request.method == 'GET':return render(request, 'upload2.html')elif request.method == 'POST':userid = request.POST.get('userid')imgs = request.FILES.getlist('imgs')print('imgs: ', imgs)# [<TemporaryUploadedFile: picture2.jpg (image/jpeg)>,# <TemporaryUploadedFile: picture3.jpg (image/jpeg)>,...]for img in imgs:# 1. 把图片存储到uploads中file_name = gen_uuid_name() + os.path.splitext(img.name)[-1]file_path = os.path.join(settings.MEDIA_ROOT, file_name) # 得到一个绝对文件路径with open(file_path, 'ab') as fp:for part in img.chunks():fp.write(part)fp.flush()# 2. 将图片路径存入到数据库中photo = PhotoModel()photo.img = 'uploads/' + file_namephoto.user_id = userid # photo.user = UserModel.objects.filter(pk=userid).first()# 没查到就是None,暂时不考虑其他问题Nonephoto.save()return render(request, 'upload2.html')
urls.py
path('upload2/', upload2), # 多文件上传
浏览器 http://127.0.0.1:8000/upload2/


可以看到,图片保存成功啦,数据也存到数据库啦
相关文章:
Django静态文件媒体文件文件上传
文章目录 一、静态文件和媒体文件1.在django中使用静态文件实践2.在django中使用媒体文件 二、文件上传单文件上传实践多文件上传 一、静态文件和媒体文件 媒体文件: 用户上传的文件,叫做media 静态文件:存放在服务器的css,js,image,font等 叫做static1.在django中…...
mysql 分库分表实现思路
MySQL的分库分表是一种常用的数据库拆分方案,它可以提高数据库的性能和扩展性。下面是一般的实现步骤: 数据库设计:首先,需要对数据库进行良好的设计。确定要分库分表的实体和关系,并根据业务需求进行合理的拆分。 数…...
Android深思如何防止快速点击
前言 其实快速点击是个很好解决的问题,但是如何优雅的去解决确是一个难题,本文主要是记录一些本人通过解决快速点击的过程中脑海里浮现的一些对这个问题的深思。 作者:流浪汉kylin 链接:https://juejin.cn/post/7197337416096055…...
PHP自己的框架cookie()使用(完善篇七)
1、PHP自己的框架cookie() 2、cookie类(CookieBase.php) <?php class CookieBase {/*** 设置cookie*/public static function set($name, $value, $expire 3600, $path , $domain , $secure false, $httponly false) {setcookie($name, $valu…...
Spring Boot Dubbo Zookeeper(含ZK安装脚本)
文章目录 Spring Boot Dubbo Zookeeper(含ZK安装脚本)简介DubboCommonProviderConsumer Zookeeper Spring Boot Dubbo Zookeeper(含ZK安装脚本) 简介 Dubbo Common 公共依赖 <!-- Spring Boot Starter --> <dependen…...
BigDecimal百科全书
一、BigDecimal简述 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。 一般情况下,…...
【30天熟悉Go语言】11 数组的全方位使用与解析
作者:秃秃爱健身,多平台博客专家,某大厂后端开发,个人IP起于源码分析文章 😋。 源码系列专栏:Spring MVC源码系列、Spring Boot源码系列、SpringCloud源码系列(含:Ribbon、Feign&…...
静态路由(详细理解+实例精讲)
系列文章目录 华为数通学习(6) 前言 一,静态路由 二,静态路由配置 三,缺省路由 四,缺省路由应用场景 总结 前言 随着华为公司的不断发展,数据通信这门技术也越来越重要,很多人…...
leetcode做题笔记118. 杨辉三角
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 思路一:动态规划 int** generate(int numRows, int* returnSize, int** returnColumnSizes){int **returnnum(int **)…...
stm32之24.RTC闹钟usart端口修改配置
(需要修改) 源码 while(1){//rtc唤醒事件if(g_rtc_wakeup_event){//获取日期RTC_GetDate(RTC_Format_BCD,&RTC_DateStructure);printf("20%02x/%02x/%02xWeek:%x\r\n",RTC_DateStructure.RTC_Year,RTC_DateStructure.RTC_Month,RTC_Date…...
Spring Security无法调用接口错误解决
之前在写程序的时候,发现有个接口使用postmapping发送请求一直无法进行调用 PostMapping("/user/login")public ResponseResult login(User user){//登录,这里登录的时候需要传入用户名和密码System.out.println("user "user.toSt…...
运维Shell脚本小试牛刀(二)
运维Shell脚本小试牛刀(一) 运维Shell脚本小试牛刀(二) 运维Shell脚本小试牛刀(三)::$(cd $(dirname $0); pwd)命令详解 一: if---else.....fi 条件判断演示 [rootwww shelldic]# cat checkpass.sh #!/bin/bash - # # # # FILE: ch…...
飞天使-python的模块与包与装饰器
文章目录 模块与包标准模块第三方模块自定义模块 高级语法切片迭代器/生成器高级模式(闭包)高级模式(装饰器) 参考视频 模块与包 标准模块 import os print(os.getcwd())import sys print(sys.argv) print(sys.platform) print(…...
linux shell脚本利用 kill -0 检查进程是否存在
1.kill -0介绍 kill -0 pid用来检查进程是否存在,kill -0 pid解释(来自man kill):“If sig is 0, then no signal is sent, but error checking is still performed.”不发送任何信号,但是系统会进行错误检查。 kill -0 pid ->若存在&am…...
抖音视频删了怎么在电脑上找回来
【昨天整理电脑文件时,不小心将剪辑好的抖音作品误删了,但是回收站中找不回来了,这些视频是我花了很多心血制作的,如果没了真的十分可惜!希望大家能帮帮我,告诉我应该如何恢复这些文件。】 现在人们都喜欢…...
方面级别情感分析之四元组预测
情感四元组预测现有方法 阅读本文之前我们默认你对情感分析有基本的认识。 如果没有请阅读文章(https://tech.tcl.com/post/646efb5b4ba0e7a6a2da6476) 情感分析四元组预测涉及四个情感元素: 方面术语a,意见术语(也叫观点术语)o, 方面类别ac,…...
算法 稀疏数组 数组优化 数组压缩 二维数组转稀疏数组 算法合集(二)
1. 五子棋游戏,玩家对战一半停战休息,此时需要存储当前对战双方棋子信息 a. 采用二维数组存储: 0为空, 1代表黑棋 2代表蓝色棋子 b. 棋盘为11行,11列 > int [][] chessArray new int [11][11]; c. 出现的问题&am…...
交换机端口安全实验
文章目录 一、实验的背景与目的二、实验拓扑三、实验需求四、实验解法1. PC配置IP地址部分2. 在SW1上开启802.1X身份验证3. 创建一个用户身份验证的用户。用户名为wangdaye,密码为1234564.创建一个端口隔离组,实现三台PC无法互相访问 摘要: 本…...
c# 本地化中英文切换
区域 线程默认区域为当前计算机所选区域 设置当前区域: Thread.CurrentThread.CurrentCulture new CultureInfo(“zh-cn”); 获取当前区域: Console.WriteLine(Thread.CurrentThread.CurrentCulture.ToString()); 区域名称: “zh-cn” 中文…...
rabbitmq的优先级队列
在我们系统中有一个 订单催付 的场景,我们的客户在天猫下的订单 , 淘宝会及时将订单推送给我们,如果在用户设定的时间内未付款那么就会给用户推送一条短信提醒,很简单的一个功能对吧,但是,tianmao商家对我们来说&#…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战
🧠关键词:Zephyr、BLE、LoRa、混合通信、事件驱动、网关中继、低功耗调度 📌面向读者:希望将 BLE 和 LoRa 结合应用于资产追踪、环境监测、远程数据采集等场景的开发者 📊篇幅预计:5300+ 字 🧭 背景与需求 在许多 IoT 项目中,单一通信方式往往难以兼顾近场数据采集…...
开疆智能Ethernet/IP转Modbus网关连接鸣志步进电机驱动器配置案例
在工业自动化控制系统中,常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中,客户现场采用了 罗克韦尔PLC,但需要控制的变频器仅支持 ModbusRTU 协议。为了实现PLC 对变频器的有效控制与监控,引入了开疆智能Etherne…...
