以下经验是在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(使用前将#替换为@)