django的静态文件和媒体文件

本文通过刘江老师的投票软件实例,详细解析了Django框架中MEDIA_URL、MEDIA_ROOT、STATIC_URL、STATIC_ROOT的配置及作用。阐述了媒体文件与静态文件的区别,包括文件路径设置、URL配置、上下文处理器的使用,以及不同访问方式的特点。

本人初学,在网上读了很多资料,基本都是粘来粘去,没有解开关于静态文件和媒体文件中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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值