Django的STATIC_URL、STATIC_ROOT、STATICFILES_DIRS、MEDIA_URL、MEDIA_ROOT意义、设置和使用

2023-05-16

以下经验是在Django2.1.1及Python3.5环境下(项目目录结构见结尾

 

1.STATIC_ROOT

首先,要有Django的开发模式和部署模式的概念(目前知道有这种东西就行,我也没用过,或者用过不知道)。

通常情况下我们是在开发模式下(Debug=True),我们可以创建project,project下放着我们建立的app。如果此时,你的static静态文件夹是放在app目录下,那么开发模式下,Django将会自动查找每个app下的静态文件并在网页中显示。(但我自己再做Django项目的时候,我的static文件是放置在了project目录下,所以我没有对这个解释进行验证)

在部署模式下,我们需要运行python manage.py collectstatic这个命令(在manage.py同级目录下运行),这个命令会把每个app目录下的文件copy到STATIC_ROOT这个文件夹下。此时为部署模式(Debug=False),如果想要通过http://127.0.0.1/static/***访问,将不会访问各个app下的static,而是STATIC_ROOT中所指定的文件夹(当然想要通过url访问,这里还少了对static_url的配置,后面会提到)

2.STATICFILES_DIR

对于STATICFILES_DIR,个人有过使用。举例:我在project下设置了一个名为static的文件夹,但不是说你在project下起名为static,Django就可以识别出它是一个静态文件夹,要告诉它,怎么告诉?答:settings中设置STATICFILES_DIR

STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

(这句代码如果看不懂,那就没办法了)至于在HTML用这个文件夹,到目前介绍的这两个东西是做不到的

3.STATIC_URL

根据我做了两个半生不熟Django项目的经验,个人认为它是一个代号,对STATIC_ROOT和STATICFILES_DIR的引用,相当于一个别名,具体怎么讲呢?

首先settings.py

STATIC_URL = '/static/'  #这个static纯属碰巧,你设置成“彭于晏”都行如果汉字允许的

怎么用呢?什么含义呢?分三种情况(前两种没有使用STATIC_URL)

1. HTML模板内 load staticfiles

{% load staticfiles %}
<script type="text/javascript" src="{%static 'js/move-top.js' %}"></script>

 

在这儿用了static,因为是{% load staticfiles %},所以static这个设定好的STATIC_URL会到STATICFILES_DIRS =[os.path.join(BASE_DIR, 'static')]字典中挨个与后面的'js/move-top.js'拼接成文件路径,直至成一个可以被Django找到的文件的文件路径,这样我们的static文件就被前端页面使用了。

2.HTML模板内 load static

{% load static %}

<script type="text/javascript" src="{%static 'js/move-top.js' %}"></script>

在这儿用了static,因为是{% load static %},所以static这个设定好的STATIC_URL会到STATICFILES_ROOT 下挨个寻找'js/move-top.js,找到了,就被前端页面使用了。(不过这个我没试,Debug一个星期了,身体扛不住,留给后来人,希望有人可以验证,当然,可以回来告诉我结果最好了)

3.如果是想放动态路径的话,直接用STATIC_URL

首先进行一些settings设置

INSTALLED_APPS中加入:
'django.contrib.staticfiles', #个人猜测是用于{% load staticfiles %}

 TEMPLATES的中加入:

'django.template.context_processors.static'  #是为了STATIC_URL可以在HTML模板中使用

  进去看看就知道加哪儿了,我这儿没说那么清,但谁会那么笨加错地方

模板中调用

<img id="head" src="{{ STATIC_URL }}{{ pic_path }}" name="default" height="100px" width="100px">

这里的{{ STATIC_URL }}就相当于 /static/,这是settings中设定的

 注:{{ }}里面放的就是变量, {% %}里放的是控制语句块for循环什么的。 很明显,static这种东西又会和后面的变量拼接成一个文件路径,这也正是我们想要的

若果想要直接url访问呢?比如http://127.0.0.1:8000/static/media/picture/8d351cefc258b35087c5ef0a8d695078.jpg

OK,你运行项目直接访问就可以看到,没有别的骚操作了,上面设置的就OK了。如果不行,可以试试在urlpatterns中加下面的东西,为什么这么加可以看看下面的。当然我不加都行,你们要是还不行,大概就是脸小吧

url(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATICFILES_DIRS[0]})

但我认为这个static_url在网址上可以直接访问是因为之前的{load staticfiles}

4.MIDEA_URL与MIDEA_ROOT

那么首先如同static_url了,要进行一些设置才可以使用。名字还是随便起,我个人理解为是MEDIA_ROOT的别名。

而MEDIA_ROOT自然是指定了文件的根目录是哪些,可以有多个,所以用字典

废话不多说,开始设置

1.在项目的运行环境下 pip install pillow,比如我是在虚拟环境Adidas里的

2.settings文件中

MEDIA_URL = '/media/'
MEDIA_ROOT = [os.path.join(BASE_DIR,'static/media')]   #浅显易懂,不需要解

        3.settings的tempalte中加入

'django.template.context_processors.media'

  #确保HTML模板可以使用media_url

4.不同于static_url没有骚操作,对于media_url我们必须设置一个跳转,让Django可以识别到它

   即在url.py文件中设置一个跳转的url

url(r'media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT[0]})

这是个大坑,超级大的坑,因为网上,十个八个写的都是settings.MEDIA_ROOT,但是这个东西是个字典啊!!!

所以一定要加[k],k对应的就是你的文件目录是指的根目录下的第几个,这就是字典,很简单

如果MEDIA_ROOT设定的是字典,url跳转也没加[0],那么恭喜,你会很开心的遇到路径错误的问题:

至此,有了三种对mdia_url的使用方法

 ①<img src="  /media/  'picture/default.jpg'  ">   

这时MEDIA_ROOT会和'picture/default.jpg'连接成一个文件路径,图片存在的话就会显示到html

 ②<img src="  {{MEDIA_URL}}  'picture/default.jpg'  ">

 如果你不想写死 'picture/default.jpg',就用一个变量代替,比如

<img src="  {{MEDIA_URL}} {{pic_path}}  ">或者<img src="  /media/ {{pic_path}}  ">

③http://127.0.0.1:8000/media/picture/default.jpg

5.项目目录

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django的STATIC_URL、STATIC_ROOT、STATICFILES_DIRS、MEDIA_URL、MEDIA_ROOT意义、设置和使用 的相关文章

随机推荐