Django静态文件&媒体文件&文件上传

这篇具有很好参考价值的文章主要介绍了Django静态文件&媒体文件&文件上传。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、静态文件和媒体文件

媒体文件: 用户上传的文件,叫做media
静态文件:存放在服务器的css,js,image,font等 叫做static

1.在django中使用静态文件

1)首先确保django.contrib.staticfiles在 INSTALLED_APPS中
2)在settings中定义STATIC_URL
	STATIC_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

Django静态文件&媒体文件&文件上传,# Django4,django,python

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

Django静态文件&媒体文件&文件上传,# Django4,django,python

如果想要额外再加一些静态文件路径,就再加一个STATICFILES_DIRS
Django静态文件&媒体文件&文件上传,# Django4,django,python

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')

Django静态文件&媒体文件&文件上传,# Django4,django,python

在项目根目录下的static和templates 也是可以这样用的

2.在django中使用媒体文件

在settings中配置	MEDIA_ROOT
	MEDIA_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':
		# 获取上传的文件,如果没有文件,则默认为None
		myFile = 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'

Django静态文件&媒体文件&文件上传,# Django4,django,python

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 uuid

from django.conf import settings

from django.shortcuts import render

# 上传文件:媒体文件
# 单文件上传
from App.models import UserModel


def 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('.') 获得最后一个.的下标, 拿到的是 .jpg
        file_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_ROOT
        print('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 = username
        user.icon = 'upload/' + file_name
        user.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/
Django静态文件&媒体文件&文件上传,# Django4,django,python
Django静态文件&媒体文件&文件上传,# Django4,django,python
可以看到上传成功啦!!!

多文件上传

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 uuid

from django.conf import settings

from 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_name
            photo.user_id = userid  # photo.user = UserModel.objects.filter(pk=userid).first()# 没查到就是None,暂时不考虑其他问题None

            photo.save()

        return render(request, 'upload2.html')

urls.py

path('upload2/', upload2),  # 多文件上传

浏览器 http://127.0.0.1:8000/upload2/

Django静态文件&媒体文件&文件上传,# Django4,django,python

Django静态文件&媒体文件&文件上传,# Django4,django,python

可以看到,图片保存成功啦,数据也存到数据库啦文章来源地址https://www.toymoban.com/news/detail-691369.html

到了这里,关于Django静态文件&媒体文件&文件上传的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • django4版本提示 django.db.utils.NotSupportedError: MySQL 8 or later is required (found 5.7.26)

    我最近学习django的时,执行python manage.py migrate报错如下: django.db.utils.NotSupportedError: MySQL 8 or later is required (found 5.7.26). 看信息是本地的mysql版本比较低,百度了以后发现Django 3.2及更高版本需要MySQL 8.0.25或更高版本,我本地的mysql版本就是5.7.26。但是我不想再装了怎么办?把m

    2024年02月05日
    浏览(62)
  • 快速上手Django(九) -Django下载文件、Django上传文件、Django实现excel导入导出

    在实际的项目中很多时候需要用到下载功能,如导excel、pdf或者文件下载。 1. Django下载文件方案和思路 将文件作为响应返回给用户:这是最常用的下载文件方法。你可以编写一个视图函数,在该函数中将文件作为响应返回给用户。 使用第三方库,如您需要支持断点续传或并发

    2024年02月05日
    浏览(55)
  • 遥遥领先,免费开源的django4-vue3前后端分离项目

    本项目前端基于当下流行且常用的vue3作为主要技术栈进行开发,融合了typescript和element-plus-ui,提供暗黑模式和白昼模式两种主题以及全屏切换,开发bug少,简单易学,项目后端采用了python的django框架作为开发模块。 目前正在搭建到网络服务器中。项目会不定期更新喜欢的朋

    2024年02月04日
    浏览(57)
  • Django后端开发——静态文件

    B站网课:点击蓝色字体跳转 或者复制网址在浏览器访问:https://www.bilibili.com/video/BV1vK4y1o7jH?p=13vd_source=597e21cf34ffcdce468ba00be2177e8a 如:图片、css、js、音频、视频 以下一行代码是手动添加的,指定了一个目录——‘static’,将在该目录下查找静态文件 模板中访问静态文件 - im

    2024年02月19日
    浏览(130)
  • django静态文件配置和使用

    一、首先需要了解的知识点是: 1、出于对效率和安全的考虑,django管理静态文件的功能仅限于在开发阶段的debug模式下使用,且需要在配置文件的INSTALLED_APPS中加入django.contrib.staticfiles(django工程创建后默认已经安装),网站正式部署上线后,静态文件是由Nginx等服务器管理。

    2024年02月02日
    浏览(48)
  • 【多媒体文件格式】AVI、WAV、RIFF

    AVI:Audio/Video Interleaved(音频视频交织/交错),用于采集、编辑、播放的RIFF文件。由Microsoft公司1992年11月推出,是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式,原先用于Microsoft Video for Windows (简称VFW)环境,现在已被Windows 95/98、OS/2等多数操作系统直接支

    2024年02月05日
    浏览(59)
  • uniapp学习API之——媒体、设备、键盘、界面、文件、绘画、

    uni.chooseImage(OBJECT) —— 图片 从本地相册选择图片或使用相机拍照。 uni.chooseVideo(OBJECT) —— video 拍摄视频或从手机相册中选视频,返回视频的临时文件路径。 uni.chooseFile(OBJECT) —— 文件 从本地选择文件。 uni.getRecorderManager() 获取全局唯一的录音管理器   recorderManager 。 uni.

    2024年02月07日
    浏览(41)
  • Django基础入门⑮:更新书籍信息 删除书籍条目信息 Django静态文件配置

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 🎁🎁: 文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。 更改原有的书

    2024年02月16日
    浏览(53)
  • Django的静态文件目录(路径)如何配置?

    通常用下面的三条语句配置Django的静态文件目录 那么这三条语句分别的作用是什么呢? 请参考博文 https://blog.csdn.net/wenhao_ir/article/details/131986394 【搜索 注册静态文件目录】

    2024年02月06日
    浏览(58)
  • Django 文件上传(十二)

    当 Django 处理文件上传时,文件数据最终会被放置在 request.FILES 。 查看文档:文件上传 | Django 文档 | Django Django工程如下:    创建本地存储目录 在static/应用目录下创建uploads目录用于存储接收上传的文件  在settings.py 配置静态目录和上传目录   1、models.py模型数据 注意:迁

    2024年02月04日
    浏览(83)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包