django的静态文件和媒体文件

本人初学,在网上读了很多资料,基本都是粘来粘去,没有解开关于静态文件和媒体文件中MEDIA_URL,MEDIA_ROOT,STATIC_URL,STATIC_ROOT的关系的疑惑。本偏以刘江老师投票软件为例,讲的很浅显,希望能帮助到和我一样有疑惑的同学

一、媒体文件:

1.设置文件存放路径 MEDIA_ROOT=os.path.join(BASE_DIR,'polls/media'), 这个告诉django我想把媒体文件放哪里

2.配置路由 re_path(r'media/(?<path>.*)$', serve, {'document_root':settings.MEDIA_ROOT})

3.在media路径下放点图片等文件,或者写好model,自己从后台传图片

4.浏览器输入:127.0.0.1:8000/polls/media/avatars/a.jpg,回车就可以看到图片了

        路径解释:

       (1)polls是一级路由,media是触发二级路由,media你也可以改成别的名字,这个只是url去触发路由,和图片的路径没任何关系

       (2)avatars/a.jpg被(?<path>.*)$捕获,并传给serve,server将path,document拼接,构成D:/djangocode/mysite/polls/media/avatars/a.jpg,django找到这个图片后返回给浏览器。其实MEDIA_ROOT也可以写成polls/,但这样的话浏览器中就要输入127.0.0.1:8000/polls/media/media/avatars/a.jpg了,总之拼接后的路径必须是图片路径即可

5.模板中使用这个图片<a href="/polls/media/avatars/a.jpg">点击查看图片</a>,但这是硬编码,不能接受,需要加变量MEIDIA_URL='/polls/media/', 因此就变成了<a href="{{MEDIA_URL}}avatars/a.jpg">点击查看图片</a>

6.运行后你会发现报错,原因是settings配置文件和模板不能直接交流,django.template.contextprocessor.media登场,这是上下文处理器,让settings和模板互通,再运行,是不是就OK啦

7.再回看,是不是发现MEDIA_URL就是一个参数而已,对, 没错,就是传递一个值而已,这样是不是就可以随便命名了,答案是NO,因为django.template.contextprocessor.media返回的就是{"MEDIA_URL":MEDIA_URL},所以不能修改。当然,如果你是大神,重写这个media上下文处理器,也是可以改滴。

二、静态文件

静态文件和媒体文件有点区别就是静态文件有两个访问方式:第一种和media完全一样,第二种是走STATIC_URL,这里讲下第二种。

1.配置STATIC_URL = '/aaa/'

2.浏览器中输入127.0.0.1:8000/aaa/polls/image/b.jpg, 就可展示图片

可以看到,这个路径中并没有我想象中的/polls/static/部分,是因为/aaa触发了STATIC_URL,django去所有static目录下寻找polls/image/b.jpg文件并返回,如果多个app,也没关系,直接127.0.0.1:8000/aaa/polls2/image/b.jpg即可

静态文件默认是走第二种方式,当然也可以使用第一种方式(但不能删掉STATIC_URL,会报错),那有人可能会问不删掉STATIC_URL怎么证明走的是第一种,可以证明:1.只配STATIC_URL时,127.0.0.1:8000/aaa/polls/image/b.jpg可以,127.0.0.1:8000/polls/aaa/polls/image/b.jpg不行。2.配STATIC_URL,STATIC_ROOT和路由时,后者就可以了,当然前者一直可以。

三、STATIC_ROOT还涉及部署,还有STATICFILES_DIRS,我还不懂,不说了

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Django 中,静态文件媒体文件是不同的。静态文件是指 CSS、JavaScript、图片等不会改变的文件,而媒体文件是指用户上传的文件,如图片、音频和视频等。 要在 JavaScript 中显示 Django 媒体图片文件,可以通过以下步骤: 1. 在 Django 项目中设置媒体文件的 URL 和目录。 在 settings.py 文件中,设置 MEDIA_URL 和 MEDIA_ROOT 变量: ```python MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') ``` 2. 在 Django 中创建一个视图函数,用于返回指定的媒体文件。 ```python from django.http import HttpResponse from django.conf import settings import os def get_image(request, filename): image_path = os.path.join(settings.MEDIA_ROOT, filename) with open(image_path, "rb") as f: return HttpResponse(f.read(), content_type="image/jpeg") ``` 3. 在 JavaScript 中使用 Ajax 请求视图函数,获取媒体文件的二进制数据,并将其渲染到 HTML 中。 ```javascript $.ajax({ url: '/get-image/filename.jpg', type: 'GET', processData: false, contentType: false, success: function(response) { var url = URL.createObjectURL(response); var img = document.createElement('img'); img.src = url; document.body.appendChild(img); } }); ``` 其中,/get-image/filename.jpg 是视图函数的 URL,response 是获取到的媒体文件的二进制数据。通过将二进制数据转换为 URL 对象,可以将图片显示在 HTML 中。 以上是一种简单的方法,在实际应用中可能需要更复杂的处理方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值