Django 1.9.7 本地访问静态文件时出错

我在开发环境里访问静态文件总显示404
奇怪的是,我在实际环境(一个云服务器)是可以正常访问这些静态文件的,
而且,我在本地访问模板可以正常返回,但是访问js/css/img等就不行

下面是我的一些配置信息

<!-- template 的设置 -->
<head>
    <meta charset="UTF-8">
    <title>...</title>
    {% load staticfiles %}
    <link rel="stylesheet" href="{% static 'css/M_index.css' %}" />
</head>
<body>
    ...
    <script src="{% static 'js/firstload.js' %}"></script>
    <script src="{% static 'js/jquery-1.10.1.min.js' %}"></script>
    <script src="{% static 'js/M_index.js' %}"></script>
</body>
# settings.py

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
if socket.gethostname() == 'chang':
    STATIC_ROOT = "../static/"
    STATIC_URL = '/static/'

STATICFILES_DIR = {
    os.path.join(BASE_DIR, 'static'),
}

(注: 我已经在INSTALLED_APPS添加了'django.contrib.staticfiles', 而且DEBUG已经设为true)

# urls.py

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
# 当我用"http://127.0.0.1:8000/admin/"访问的时候,出现了以下报错信息

[21/Jan/2018 12:32:50] "GET /admin/ HTTP/1.1" 200 1243
[21/Jan/2018 12:32:50] "GET /static/css/M_index.css HTTP/1.1" 404 1772
[21/Jan/2018 12:32:50] "GET /static/js/firstload.js HTTP/1.1" 404 1772
[21/Jan/2018 12:32:50] "GET /static/js/jquery-1.10.1.min.js HTTP/1.1" 404 1796
[21/Jan/2018 12:32:50] "GET /static/js/M_index.js HTTP/1.1" 404 1766
#这里是当请求加载css的时候,控制台记录的一些记录(请求, 返回头什么的)

General:
Request URL:http://127.0.0.1:8000/static/css/M_index.css
Request Method:GET
Status Code:404 Not Found
Remote Address:127.0.0.1:8000
Referrer Policy:no-referrer-when-downgrade

Response Headers:
Content-Type:text/html
Date:Sun, 21 Jan 2018 04:32:50 GMT
Server:WSGIServer/0.1 Python/2.7.2

Request Headers:
Accept:text/css,*/*;q=0.1
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9
Cache-Control:no-cache
Connection:keep-alive
Cookie:csrftoken=XMZrfTiyLJ512OnmWOTcZJGkcZPxsM0d
Host:127.0.0.1:8000
Pragma:no-cache
Referer:http://127.0.0.1:8000/admin/
User-Agent:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Mobile Safari/537.36

# 这里有点奇怪, 我请求的是一个css文件, 但是他返回头里却写着"text/html"

还有一点比较奇怪的是,我static目录是"根目录>static"这样子的",可是还是出现""GET /static/js/M_index.js HTTP/1.1" 404"这样的错误, 很费解

我曾查找资料,比如改为绝对路径,添加/static/匹配url, 然后调用django.contrib.staticfiles.views.serve()这些都尝试过不行,

如果大家有什么解决办法, 请告诉我, 谢谢~

阅读 10.6k
3 个回答

settings.py里的STATICFILES_DIR不应该是STATICFILES_DIRS吗?

问题已经解决, 有两种解决办法

1, 建立STATICFILES_DIRS[](注意是列表或者是元组,不是字典!), 把static的地址加入到里面, 同时注意不能包含STATIC_ROOT里面的地址, 否则会报错(ImproperlyConfigured: The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting),这样在实际环境还是生产环境都能完美运行.(推荐)

2, 保持原有设置不变, 但是把static复制到应用中的文件夹里面, 用于调试. 调试的时候模板调用的是应用中文件夹的static, 那么修改的也应该修改这个, 调试完毕再把它覆盖到真正的static提交, (亲身试验过可行, 但是很麻烦, 每次提交都要先覆盖, 在知道1这个答案之前我一直用这个方法)

希望能对你有帮助

报错(ImproperlyConfigured: The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting),是因为settings.py中设置STATICFILES_DIRS和STATIC_ROOT的路径值不能相同~

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题