文章目录
  1. 1. 概述
  2. 2. django静态文件分类
  3. 3. staticfiles
  4. 4. 静态文件配置项
    1. 4.1. STATIC_ROOT 配置项
    2. 4.2. STATIC_URL配置项
    3. 4.3. STATICFILES_DIRS配置项
    4. 4.4. STATICFILES_STORAGE配置项
    5. 4.5. STATICFILES_FINDERS配置项
    6. 4.6. ADMIN_MEDIA_PREFIX配置项
  5. 5. 开发环境
    1. 5.1. 在自定义的STATICFILES_DIRS寻找静态文件
    2. 5.2. 在自定义的 STATIC_ROOT 寻找静态文件
  6. 6. 生产环境
  7. 7. 参考

概述

用了django将近一年的时间了,期间也遇到了各种问题,但是最大的问题之一就是django的静态文件管理,终于下定决心把django关于静态文件的坑给踩了。

django静态文件分类

django把静态文件分为两类: staticmedia,django是按照是否与用户交互来进行区分的。

  • STATIC_ROOT配置项用来管理静态资源文件。应用页面需要的(JS, CSS, Image…),这些相对来说是提供给用户的,即这些文件(非严格讲)没有与用户进行互动,开发者产生这些文件为访问用户服务,用户只是单纯的享受应用服务。它们通过manage.py collectstatic命令汇集到 settings.STATIC_ROOT目录,并通过settings.STATIC_URL指定的路径访问。

  • MEDIA_ROOT 配置项用来管理用户上传的文件。通常经由FileFields字段上传,它们保存在 settings.MEDIA_ROOT指定的目录下,通过settings.MEDIA_URL指定的路径访问。

staticfiles

Django 1.3中,staticfiles默认是启用的。如果是从1.3之前的代码迁移过来,启用代码如下:

1
2
INSTALLED_APPS += ('django.contrib.staticfiles',)
TEMPLATE_CONTEXT_PROCESSORS += ('django.core.context_processors.static',)

静态文件配置项

STATIC_ROOT 配置项

用来指定执行manage.py collectstatic时静态文件存放的路径。在生成环境中,集中存放静态资源有利于使用Lighttpd/Nginx/apache2托管静态资源。STATIC_ROOT文件夹是用来将所有STATICFILES_DIRS中所有文件夹中的文件,以及各app中static的文件都复制过来。为了方便调试,通常设置如下:

1
2
3
4
PROJECT_DIR = os.path.dirname(os.path.dirname(__file__))
BASE_DIR = os.path.dirname(PROJECT_DIR)

STATIC_ROOT = os.path.join(BASE_DIR, 'run', 'static')

STATIC_ROOT可以根据情况自行修改路径。

STATIC_URL配置项

django模板中,可以引用变量避免把路径写死。通常使用默认设置:

1
STATIC_URL = '/static/'

STATICFILES_DIRS配置项

在执行manage.py collectstatic, django除了搜集每个已经安装app中的static文件夹,django还会搜集STATICFILES_DIRS定义的文件列表。

STATICFILES_STORAGE配置项

STATICFILES_STORAGE配置项用来控制文件被聚集起来的方式。默认值是django.contrib.staticfiles.storage.StaticFilesStorage,表示将文件集合在STATIC_ROOT配置项指定的文件夹中。

STATICFILES_FINDERS配置项

默认配置:

1
2
3
4
5
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
  • FileStstemFinder用来用STATICFILES_DIRS【默认为空】指定的路径中查找额外的静态文件。像jquery,bootstrap等这样公用的资源文件都是在多个不同的app中共用的,django提供了公有的目录来放这些文件,这个配置参数就是:STATICFILES_DIRS。
  • AppDirectoriesFinder从INSTALLED_APPS元组中的APP所在包的static目录中查找资源文件。

STATICFILES_FINDERS被用来寻找源静态文件。AppDirectoriesFinder用来在每个app中的static文件搜索静态文件,如: $app_name/static/FileSystemFinder用来搜索在STATICFILES_DIRS配置项中指定的文件夹列表中寻找静态文件。

ADMIN_MEDIA_PREFIX配置项

ADMIN_MEDIA_PREFIX必须为如下配置,以便staticfiles能够正确找到django.contrib.admin的静态资源:

1
ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'

在模板中使用STATIC_URL:

1
<link rel="stylesheet" href="{{ STATIC_URL }}css/core.css">

开发环境

在自定义的STATICFILES_DIRS寻找静态文件

使用方式:

  • 保证django.contrib.staticfilesINSTALLED_APPS
  • TEMPLATES配置中添加django.template.context_processors.static
  • 在模板中使用STATIC_URL变量,eg:<img src="girl.png>

本文末尾的参考文献中,有一篇文章建议不要使用STATIC_URL变量。

在自定义的 STATIC_ROOT 寻找静态文件

如果你想访问静态文件时,静态文件在STATIC_ROOT中寻找,使用如下方式:

1
2
3
urlpatterns += [
url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
]

这种方法不推荐,理由:开发过程中需要不断的执行./manage.py collectstatic

生产环境

生产环境不同开发环境,生产环境下(DEBUG=False),django.contrib.staticfiles是不起任何作用的,也就说django.contrib.staticfiles只对开发环境(DEBUG=True)开启。

With debug turned off Django won’t handle static files for you any more - your production web server (Apache or something) should take care of that.

有如下两种方式在生产环境下依然可以让django自带的方式支持静态文件:

第一种方式:

1
python manage.py runserver --insecure

第二种方式:

1
2
3
4
if settings.DEBUG is False:
urlpatterns += [
url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
]

此方法开发过程中需要不断的执行./manage.py collectstatic

参考