• Django对静态文件的处理——部署阶段


    Django 的官方文档中说,Django 主要关注的是 Web App 的动态部分,像图片、CSS、JS 等的静态文件都应该交由专门的服务器来处理。

    但在开发阶段,本地不一定能模拟生产环境,这时也是要使用静态文件的。为此 Django 提供了一些工具来处理静态文件,作为开发阶段的临时解决方案。

    所以就分 开发阶段 和 部署阶段 两种情况来说 Django 的静态文件处理。

    部署阶段

    这个比较简单,因为 Django 将这部分的工作完全抛给服务器(比如 Nginx)了:在 HTML 中指定 URL,同时将要用到的静态文件都放在一个地方,然后告诉服务器当对这些 URL 发起请求时到这个地方去寻找。

    Django 在这个阶段的工作中只是提供了几个辅助工具。

      • django.contrib.staticfiles,用来将该 Django 项目用到的所有静态文件统一收集到一个单独的文件夹中,这样在服务器配置中指向这个文件夹即可。主要操作如下:

        • 到 settings.py 中设置 STATICFILES_DIRS(可以不设置),告诉 staticfiles 去哪儿找静态文件。同时,staticfiles 默认都会搜集每个应用目录下的 static/ 文件夹。

        • 到 settings.py 中设置 STATIC_ROOT ,告诉 staticfiles 将所有的静态文件收集到哪里。

        • 确保 INSTALLED_APPS 中有 django.contrib.staticfiles 这项。

        • 运行如下命令后,所有的静态文件就会被拷贝到 STATIC_ROOT 目录下。

          1
          ./manage.py collectstatic

    当然了,你完全可以不用管这些,手动将你要用到的静态文件收集到一起,如果你的项目很小的话。staticfiles 只是一个可选工具,其本身也是在 1.3 之后才引入 Django 中,它的前身是 Django 的第三方工具包 django-staticfiles

      • static 模板标签,用来生成静态文件的 URL 地址。这样当负责静态文件的服务器发生变动的时候,就不用一个个地改模板了。有以下几种方式:

        • 直接在模板中使用 STATIC_URL 变量,比如

          1
          <img src="{{ STATIC_URL }}images/hi.jpg" />

          当然这个变量不是凭空来的,它是 django.core.context_processors.static 提供的,默认已经在 TEMPLATE_CONTEXT_PROCESSORS 中开启了。因为用到了 context_processor,所以你需要在渲染模板的时候使用RequestContext ,如果你用的是 render_to_response,那么就是:

          1
          2
          return render_to_response("some.html", {},
                  context_instance=RequestContext(request))
        • 如果嫌 RequestContext 麻烦,你可以使用 get_static_prefix 这个内置的模板标签,效果是一样的:

          1
          2
          {% load static %}
          <img src="{% get_static_prefix %}images/hi.jpg" />
        • 你也可以用另外一个内置模板标签 static,同样不需要 RequestContext:

          1
          2
          {% load static %}
          <img src="{% static "images/hi.jpg" %}" />

          它实际上调用的是 Python 内置模块中的 urlparse.urljoin(),将 STATIC_URL 和 后面的 path 拼接到了一起。

        • 还有一个同名但更强大的 static 模板标签,存在于之前提到过的 staticfiles 组件中,用法类似:

          1
          2
          {% load staticfiles %}
          <img src="{% static "images/hi.jpg" %}" />

          注意 load 的对象不同。这个 static 的强大之处在于,即使你更换了静态文件的存储方式(比如使用了 CDN 或者某种云服务),仍然不用修改模板。你只需要更改 STATICFILES_STORAGE 中使用的存储引擎即可,通过修改存储引擎中的对应方法来改变 static 标签的行为。

    这几个方法看起来让人眼花缭乱,实际使用中不用纠结这么多,Django官方建议直接使用 staticfiles 中的 static,以方便以后的扩展。而前三种方法,大概可以看做历史遗留产物了吧。

    这就是 Django 为部署阶段提供的两方面帮助:收集静态文件,生成静态资源的 URL。

    下面来总结下上面提到过的 settings.py 中的设置项:

    • STATIC_ROOT:执行 ./manage.py collectstatic 后,所有静态文件就会被收集到这个文件夹下;

    • STATIC_URL:静态文件的 URL 前缀,供类似 static,get_static_prefix 等模板标签使用;

    • STATICFILES_DIRS:除 每个应用目录下的 static/ 目录外,其他静态文件可能存放的目录;

    • STATICFILES_FINDERS:告诉 collectstatic 命令都需要去哪儿找静态文件,以及寻找的顺序,有点儿类似 TEMPLATE_LOADERS;

    • STATICFILES_STORAGE:collectstatic 命令所使用的存储引擎,默认情况下不用修改,使用内置的 StaticFilesStorage 即可。如果要使用 CDN 或云服务来提供静态资源,可以编写相应的存储引擎并替换即可。

    • INSTALLED_APPS:要使用上面这些功能,就要在这里开启 django.contrib.staticfiles 这个应用;另外,只有在这里出现的应用才会被 collectstatic 搜集到。

    还有两个相关的设置项:

    • MEDIA_ROOT:用来存放用户上传文件的目录。

    • MEDIA_URL:用户上传文件的 URL 前缀。

    在之前版本的 Django 中,不区分 MEDIA_ROOT 和 STATIC_ROOT,显然不太合适。分开之后,你可以将 MEDIA_ROOT 中的文件像其他静态文件一样,交给专门的服务器处理,或者使用 CDN 和云服务资源。staticfiles 这个工具并不干涉 MEDIA_ROOT 中的文件。用户上传文件在 Django 看来属于 Stored Files,区别于 Static Files 来看待,这就是另外一个话题了。

  • 相关阅读:
    LeetCode 242. Valid Anagram (验证变位词)
    LeetCode 205. Isomorphic Strings (同构字符串)
    LeetCode 204. Count Primes (质数的个数)
    LeetCode 202. Happy Number (快乐数字)
    LeetCode 170. Two Sum III
    LeetCode 136. Single Number (落单的数)
    LeetCode 697. Degree of an Array (数组的度)
    LeetCode 695. Max Area of Island (岛的最大区域)
    Spark中的键值对操作
    各种排序算法总结
  • 原文地址:https://www.cnblogs.com/zhwl/p/4301175.html
Copyright © 2020-2023  润新知