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