前言
我的版本是django1.8,对于这个问题的解决网上有很多方法,但我看了十多篇博客,把他们的解决方案都试了,然而都没有成功,四个多小时心态崩了n次。。。好在最后偶然解决了(Why?),这是我的解决方案,另外我再讲一下我踩过的坑,大家顺便不要踩了,或者试着踩一下(也许版本不同反而是一种解决办法)
具体情况:
目录结构(一定要用最简单的结构测试):
mysite\
++mysite\
++++urls.py
++++settings.py
++static\
++++mystyle.css
++templates\
++++index.html
解决方案:
一、代码:
settings.py新增部分:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
urls.py 中 urlpatterns数组 新增部分:
from django.views.static import serve
url(r'staticfiles(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT}),
index.html 部分:
<link rel="stylesheet" type="text/css" href="/static/mystyle.css">
二、说明:
注意到BASE_DIR含义(我用pycharm生成django项目,它会自动给你添加的),
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))).replace('\\', '/')
三、分析:
我不是计算机专业的,措辞不专业多多谅解。
区分哪些变量是自己定义的,哪些变量时django定义的非常重要。
首先,settings.py中对于STATIC_URL的定义是生成project时自带的,应该是django自身需要调用的吧,所以STATIC_URL是django定义的(有一种解释是:“把/static/打头的请求转移到静态文件目录里面”)我不知道它是什么意思,就不准备动它了。
其次,STATIC_ROOT这是是我自己定义的变量,这里面存储的是本地地址(假设对应E:/mysite/static),用于和服务器地址对应。
映射关系存储在urls.py中,r’staticfiles(?P.*)$’ 具体含义不解释了,意思大体是staticfiles后面的东西是我们关心的。假设输入http://127.0.0.1:8000/staticfiles/mystyle.css,就提取有用信息mystyles.css, 好。然后{‘document_root’: settings.STATIC_ROOT}),这是个字典,我们关心STATIC_ROOT(刚解释了假设对应E:/mysite/static),那么我们找的本地地址就出来了(E:/mysite/static/mystyle.css),很好。
现在我们就把http://127.0.0.1:8000/staticfiles/mystyle.css(服务器地址)和E:/mysite/static/mystyle.css(本地地址)对应起来了。有点啰嗦,看懂就好。
坑一:
url( r'^static/(?P<path>.*)$', 'django.views.static.serve',{ 'document_root': settings.STATIC_URL }),
报错:
view must be a callable or a list.tuple in the case of include()
解决方案:
from django.views.static import serve
url( r'^static/(?P<path>.*)$', serve,{ 'document_root': settings.STATIC_URL }),
原因分析:
有一种说法:django 1.10之后不在支持URL用字符串表示了
总结:
仔细想想这次为什么这么挫折?
一、我没有把目录结构最简化就进行测试了
我的目录结构:
mysite\
++mysite\
++++urls.py
++++settings.py
++myapp\
++++urls.py
++++static\
++++++mystyle.cs
++++templates\
++++index.html
++static\
++++mystyle.css
++templates\
++++index.html
相对复杂的环境测试需要考虑的因素多,而且不容易分析。
二、重名问题
所有名称都是static,包括服务器地址、本地地址等等我在测试过程中都使用了一个名字,混淆很严重,不容易分析。