Django对静态文件的处理——开发阶段

上一篇说完了 Django 为部署阶段所提供的静态文件处理工具,这篇接着说开发阶段。django

开发阶段服务器

在 Django 看来,静态文件的处理应该交由另外的程序来处理。但为了方便快速开发,Django 也提供了一些工具,在开发阶段临时顶替来处理静态文件。框架

一方面,Django 的官方文档中用“quick and dirty”“grossly inefficient”“insecure”等字眼来屡次强调不要在实际生产环境中使用这套工具;另外一方面,Django 限制只有在 DEBUG 模式下这些工具才能工做。因此,当作辅助工具用就好,不要在生产环境下使用。函数

另外,与 上一篇中的那些工具同样,这里介绍的工具也在 staticfiles 应用下,都须要首先在 INSTALLED_APPS 中开启 django.contrib.staticfiles 这一项。工具

分两种状况来讲:post

  • 若是你是用 runserver 命令在本地启动的 Django 程序,那么这些辅助工具就已经自动开始为你服务了。即,全部 STATIC_URL 下的请求都会自动被处理,显示所需的静态文件。ui

  • 若是你在本地用的别的服务器(好比 Apache)来启动 Django 程序,那么有如下几种方式来开启静态文件处理程序。url

    • 在 URL 配置文件中添加两行内容,以下,spa

      1
      2
      3
      4
      5
      from django.contrib.staticfiles.urls import staticfiles_urlpatterns
                                                                                                                              
      # ... the rest of your URLconf goes here ...
                                                                                                                              
      urlpatterns + = staticfiles_urlpatterns()

      它会自动将 STATIC_URL 匹配到相应的 STATICFILES_DIRS、应用目录内的 /static 文件夹。(注意不是 STATIC_ROOT)rest

    • 上个方法只对本地静态文件(STATIC)有效,而不会处理用户上传文件(MEDIA)。要让 Django 处理除 STATIC 之外的静态文件,稍微麻烦一点儿,

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      from 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 能够用,

      1
      2
      3
      4
      5
      6
      from 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 中的静态文件处理就是这些内容。

相关文章
相关标签/搜索