上一篇说完了 Django 为部署阶段所提供的静态文件处理工具,这篇接着说开发阶段。
开发阶段
在 Django 看来,静态文件的处理应该交由另外的程序来处理。但为了方便快速开发,Django 也提供了一些工具,在开发阶段临时顶替来处理静态文件。
一方面,Django 的官方文档中用“quick and dirty”“grossly inefficient”“insecure”等字眼来多次强调不要在实际生产环境中使用这套工具;另一方面,Django 限制只有在 DEBUG 模式下这些工具才能工作。所以,当做辅助工具用就好,不要在生产环境下使用。
另外,与 上一篇中的那些工具一样,这里介绍的工具也在 staticfiles 应用下,都需要首先在 INSTALLED_APPS 中开启 django.contrib.staticfiles 这一项。
分两种情况来说:
如果你是用 runserver 命令在本地启动的 Django 程序,那么这些辅助工具就已经自动开始为你服务了。即,所有 STATIC_URL 下的请求都会自动被处理,显示所需的静态文件。
如果你在本地用的别的服务器(比如 Apache)来启动 Django 程序,那么有以下几种方式来开启静态文件处理程序。
在 URL 配置文件中添加两行内容,如下,
12345from
django.contrib.staticfiles.urls
import
staticfiles_urlpatterns
# ... the rest of your URLconf goes here ...
urlpatterns
+
=
staticfiles_urlpatterns()
它会自动将 STATIC_URL 匹配到相应的 STATICFILES_DIRS、应用目录内的 /static 文件夹。(注意不是 STATIC_ROOT)
上个方法只对本地静态文件(STATIC)有效,而不会处理用户上传文件(MEDIA)。要让 Django 处理除 STATIC 以外的静态文件,稍微麻烦一点儿,
12345678910from
django.conf
import
settings
# ... the rest of your URLconf goes here ...
if
settings.DEBUG:
urlpatterns
+
=
patterns('',
url(r
'^media/(?P<path>.*)$'
,
'django.views.static.serve'
, {
'document_root'
: settings.MEDIA_ROOT,
}),
)
其实与上一个方法的区别就在于,需要分别手动指定 URL 和 本地路径。
有的文章的介绍中不是用 'django.views.static.serve' ,而是 'django.contrib.staticfiles.views.serve',写法略有不同,但就别纠结了,两者基本上一样。
为了让上个写法更简单点儿,还有一个简单函数 static 可以用,
123456from
django.conf
import
settings
from
django.conf.urls.static
import
static
urlpatterns
=
patterns('',
# ... the rest of your URLconf goes here ...
)
+
static(settings.MEDIA_URL, document_root
=
settings.MEDIA_ROOT)
这样能简洁很多。
最后,有两个使用前提要注意:1)要在 DEBUG 模式下使用这些工具;2)STATIC_URL 或 MEDIA_URL 要为本地路径,不能为空,也不能是完整的 URL 格式(比如 http://static.example.com/);
这些用法都没有明显的优劣,选一种就好了。显然很多冗余的功能都是历史遗留的产物。
写到这儿,又想起在练级里边提到过的东西。Django 一开始可能也没有这么复杂,很多功能也许很简陋,但容易理解;随着社区的发展,越来越多的东西加进来,为了能够向后兼容,很多相似功能都保留了下来。对于早期使用者来说这个框架越来越好用,但对新手来说入门越来越难,繁多而类似的功能只能干扰视线。开源框架也是产品,你需要在新用户和老用户之间做好权衡。
关于 Django 中的静态文件处理就是这些内容。