django访问静态文件遇到的问题

在用django做管理后台时,遇到了下面的问题:

1
2
3
4
[16/Sep/2015 15:58:38] "GET /video/static/admin/css/base.css HTTP/1.1" 404 105
[16/Sep/2015 15:58:38] "GET /video/static/admin/css/changelists.css HTTP/1.1" 404 112
[16/Sep/2015 15:58:38] "GET /video/static/admin/js/core.js HTTP/1.1" 404 103
[16/Sep/2015 15:58:38] "GET /video/static/common/change_list.css?v=20150331 HTTP/1.1" 404 109

原因:这些文件是django库自带的一些文件,并没有在我们服务的目录下面,因此找不到。
下面会对python访问静态文件做一些说明。
需要配置一些文件
(1) django_urls.py

1
2
3
4
5
urlpatterns = patterns('',
url(r'^video/admin/', include(admin.site.urls)),
url(r'^video/(?P<path>.*)$', 'pyutil.django.views.static.serve',
{'document_root': '.'}),

document_root的值就是静态文件所在的目录,这里设置为当前目录,既工程所在的目录,在我的程序中就是video。
例如,访问:host/video/static/html/index.html,就会返回video/static/html文件夹下的index.html。
(2) settings.py

1
2
3
4
5
6
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
STATIC_URL = '/video/static/'
STATIC_ROOT = 'static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "webroot/static"),
)

其中,STATIC_URL是我们访问静态文件的路由。这里需要说明下STATIC_ROOTSTATICFILES_DIRS的关系。
STATICFILES_DIRS是存放app对应的静态文件目录。们的服务是其中的一个app,这个目录也就是存放我的服务的静态文件。
配置中,还有其他的app,如下。每个app的静态文件都存放在相应的STATICFILES_DIRS目录中。

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'video.djangosite.service',
)

当 settiing.py中DEBUG = True 时,Django会自动到各个app中找到放在里面的静态文件
如果执行 python manage.py collectstatic 。django就会收集各个app的STATICFILES_DIRS目录下的文件放到STATIC_ROOT中。

注:STATIC_ROOT不能STATICFILES_DIRS相同,或者是其的子目录。否则就会报错:”ImproperlyConfigured: The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting”

针对最初的问题,我们可以在DEBUG模式下运行程序,或者收集静态文件到当前工程的目录下。