django开发者最关心的是web应用中的动态部分-视图函数和模板。但是明显,web应用还有其他需要注意的部分:静态文件(图片,css,javascript等等),那些都是渲染一个完整的页面需要的东西。

对于小项目来说,这不是一个大问题,因为你只需要把你要用到的静态文件放到服务器能访问到的地方就ok了。然而,在比较大的项目里面-尤其是那些由多个app组成的-处理不同app之间的静态文件开始变得麻烦起来。这就是django.contrib.staticfiles的价值所在:它会收集你每个应用程序里面的静态文件放到一个可以被你的服务器容易访问到的位置里面。

使用方法

基本用法

  1. 把你的静态文件放在放在staticfiles可以找到的地方:默认情况下,这意味着是在你的INSTALLED_APPS中的一个app的static/子目录下。你可以使用STATICFILES_DIRS定义静态文件的存放位置,同时也可以使用STATICFILES_FINDERS定义staticfiles如何找到你的静态文件
  2. 确保django.contrib.staticfiles在你的INSTALLED_APPS里面:静态文件的默认url是以STATIC_URL(默认是/static/)开头的
  3. 你可以在你的模板中这样引用静态文件
<img src="{{ STATIC_URL }}images/hi.jpg" />

简单的部署静态文件

当你准备好离开本地开发环境然后部署你的项目的时候:

  1. 设置STATIC_URL为你的公共的静态文件的url(虽然默认的/static就已经挺ok的)
  2. 设置STATIC_ROOT为你的静态文件被收集的绝对路径(当你使用collectstatic管理命令的时候会用到)
    STATIC_ROOT = "/home/jacob/projects/mysite.com/sitestatic" 
  3. 运行collectstatic管理命令。这会遍历你的静态文件的存储路径并把所有的静态文件拷贝到STATIC_ROOT指定的目录下。
    ./manage.py collectstatic 
  4. 通过配置你选择的web服务器的STATIC_ROOT和STATIC_URL来部署和服务静态文件。

在模板中引用静态文件

有时候你需要在你的模板文件中引用静态文件,你可以像下面这样把一个url硬编码在模板中

<img src="http://static.example.com/static/myimage.jpg" />

很显然,这不是一个很好的做法,因为当你改变了静态文件的存放位置的时候你需要逐一的去修改代码,这将是一个毁灭性的工作,并且也不利于部署。

更好的方法应该是使用STATIC_URL,就像上面的例子一样,这意味着你需要该一个值:STATIC_URL,这将是你工作大大减少。

django提供了几个内建的方法在模板中使用这个配置值:上下文处理器和模板标签

在上下文处理器中使用

自带的上下文处理器是非常简单的方法,只要你保证django.core.context_processors.static在你的TEMPLATE_CONTEXT_PROCESSORS里面,默认是已经包含的啦

一旦确保在里面,你就可以在你的模板中使用了。

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

如果{{STATIC_URL}}没有生效,请检查你是否使用了RequestContext(要求使用RequestContext)

在模板标签中使用

直接看例子吧

{% load staticfiles %}
<img src="{% static "images/hi.jpg" %}" />
<!--可以接受模板上下文变量--->
{% load staticfiles %}
<link rel="stylesheet" href="{% static user_stylesheet %}" type="text/css" media="screen" />

在开发中服务静态文件

静态文件工具总是想帮助成功的把静态文件部署进产品环境里面,这通常意味着一个独立的专用的静态文件服务器(在本地开发时是一个很大甚至很烦的开销)。因此,staticfiles应用自带了一个快速但复杂的帮助视图函数去帮助你在开发中在本地服务静态文件。

当你使用内建的runserver命令时,这个视图函数自动启用并且在你使用STATIC_URL的时候服务你的静态文件。

如果你想使用其他的服务器进行本地开发的时候,要想启用这个视图函数,你可以在你的urlConf文件里面添加几行代码(第一行保证在urlconf的顶部,最后一行在urlconf的底部)

from django.contrib.staticfiles.urls import staticfiles_urlpatterns

#你剩下的urlconf配置

urlpatterns += staticfiles_urlpatterns()

注意:

  • 这仅仅在DEBUG=True是生效,因为这个视图函数是非常低效和可能不安全的,应该只用于开发而不能用于产品
  • 另外,当使用staticfiles_urlpatterns时,你的STATIC_URL不能为空串或者一个完整的url,比如http://static.example.com/

服务其他目录

serve(requestpathdocument_rootshow_indexes=False)

这个视图函数可以服务任何的给定的目录(再次重复,仅仅用于开发环节,不要用于产品)。最有可能的例子可能是MEDIA_ROOT中用户上传的内容,因为staticfiles是为静态文件服务的因而没有内建的处理用户上传内容的方法,不过你可以像下面这样做(前提是保证你的MEDIA_URL的值是/media/)

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,
}),
)
static(prefixview='django.views.static.serve'**kwargs)

如果你觉得定义一个url patterns比较烦,那么你可以试一下这个函数static,这个函数接受一个前缀(比如 MEDIA_URL)和一个点号路径的视图函数,以及其他的关键字参数

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)

在产品中服务静态文件

把静态文件放到产品环境中的基本轮廓是简单的:当静态文件发生变化时运行collectstatic,然后安排收集的静态文件目录(STATIC_ROOT)移到静态文件服务器然后提供服务。

当然,和所有的部署任务一样,细节是魔鬼。每一个产品安装都会有不一样的地方,因此你需要根据你的需要去调整的基本框架,下面是一个常见的可能会有用的部分。

为来自同一个服务器的app和静态文件提供服务

  • 把你的代码放到部署服务器上
  • 在服务器上运行collectstatic命令把所有的静态文件拷贝到STATIC_ROOT指向的目录
  • 为你的服务器指明STATIC_ROOT的位置(可以参照如何部署django那节内容)

你可能想自动化完成这个过程,特别是你有多个服务器的时候。有很多方法可以完成这个自动化,但django开发者比较享受的是Fabric,如果想了解的话,自己去看Fabric的文档吧,下面是一个例子:

from fabric.api import *

# Hosts to deploy onto
env.hosts = ['www1.example.com', 'www2.example.com'] # Where your project code lives on the server
env.project_root = '/home/www/myproject' def deploy_static():
with cd(env.project_root):
run('./manage.py collectstatic -v0 --noinput')

在专用的服务器上为静态文件提供服务

大部分的比较大的django应用都会使用独立的服务器-没有运行django-只是为静态文件提供服务的。这个服务器通常运行着不同类型的web服务器-更快但功能更集中。比如:

  • lighttpd
  • nginx
  • tux
  • Cherokee
  • Apache的简装版

如何配置这些服务器超出了本节的范围,你可以自己去下载和查看他们的使用文档。

由于这些静态文件服务器可能没有运行django,所以你需要修改部署策略使得看起来是这样的:

当你的静态文件改变的时候,在本地运行collectstatic

把你的本地的STATIC_ROOT目录放到静态文件服务器提供服务的那个目录下。rsync(rsync是类unix系统下的数据镜像备份工具)是这个步骤的一个好选择,因为它仅仅需要改变哪些已经发生变化的静态文件的位。

from fabric.api import *
from fabric.contrib import project # Where the static files get collected locally
env.local_static_root = '/tmp/static' # Where the static files should go remotely
env.remote_static_root = '/home/www/static.example.com' @roles('static')
def deploy_static():
local('./manage.py collectstatic')
project.rysnc_project(
remote_dir = env.remote_static_root,
local_dir = env.local_static_root,
delete = True
)

django “如何”系列10:如何管理静态文件的更多相关文章

  1. django之管理静态文件

    管理静态文件 项目中的CSS.图片.js都是静态文件 配置静态文件 在settings 文件中定义静态内容 STATIC_URL = '/static/' STATICFILES_DIRS = [ o ...

  2. django基础知识之管理静态文件css,js,images:

    管理静态文件 项目中的CSS.图片.js都是静态文件 配置静态文件 在settings 文件中定义静态内容 STATIC_URL = '/static/' STATICFILES_DIRS = [ o ...

  3. django1.10使用本地静态文件

    django1.10使用本地静态文件方法 本文介绍的静态文件使用,是指启动web站点后,访问静态资源的用法,实际静态资源地址就是一个个的url 如果没有启动web站点,只是本地调试html页面,那直接 ...

  4. python的Web框架,Django模板变量,过滤器和静态文件引入

    HTML模板的路径查找 在setting中设置查找路径: #默认的查找在此处填写,优先级最高,为在manage.py的同级路径中,添加(常规是template)文件夹,在(template)文件夹中配 ...

  5. django 简易博客开发 3 静态文件、from 应用与自定义

    首先还是贴一下源代码地址  https://github.com/goodspeedcheng/sblog 上一篇博客我们介绍了 django 如何在views中使用templates以及一些常用的数 ...

  6. linux入门系列9--用户管理及文件权限控制

    ​ 前面文章分享了Linux下常用命令以及Shell编程相关知识,本节继续学习Linux用户管理及文件权限控制. ​ Linux是多用户多任务操作系统,具有很好的稳定性和安全性.既然是多用户,那就意味 ...

  7. 第一个Django应用 - 第六部分:静态文件

    前面我们编写了一个经过测试的投票应用,现在让我们给它添加一张样式表和一张背景图片. 除了由服务器生成的HTML文件外,WEB应用一般需要提供一些其它的必要文件,比如图片文件.JavaScript脚本和 ...

  8. django模版中配置和使用静态文件方法

    1 在项目根路径下创建静态文件目录static: test3 是我的项目名,根目录下面: booktest 是一个应用 static是我建立的静态文件目录(这个名字其实可以叫其他的),静态文件都放在这 ...

  9. Django学习(6)配置静态文件

      本文将详细讲述如何在Django中配置静态文件,如图片(images),JavaScript,CSS等.   我们将要实现的网页如下: 当按下按钮"Change Text"时, ...

随机推荐

  1. 洛谷 P1291 [SHOI2002]百事世界杯之旅 解题报告

    P1291 [SHOI2002]百事世界杯之旅 题目描述 "--在2002年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字.只要凑齐所有百事球星的名字,就可参加百事世界杯之旅的抽 ...

  2. 【枚举】 最大子矩阵(I)

    题注:最大子矩形问题的解决办法最初由中国国家集训队王知昆前辈整理并发表为论文,在此说明并感谢. Definition 给你一个大矩形,里面有一些障碍点,求一个面积最大的矩形,满足该矩形在大矩形内部且该 ...

  3. 【神仙DP】【单调队列】【模拟题】区间覆盖

    传送门 Description 给出数轴上的n个线段,保留最多k条线段,问这些被保留下来的线段的并集长度为最多为多少. Input 第一行两个数n和k 接下来n行,每行两个数,表示一条线段的左右端点. ...

  4. 剑桥offer(31~40)

    31.题目描述 统计一个数字在排序数组中出现的次数. 思路:找到最低和最高,相减 class Solution { public: int GetNumberOfK(vector<int> ...

  5. Emmet缩写语法

    缩写语法 Emmet 使用类似于 CSS 选择器的语法描述元素在生成的文档树中的位置及其属性. 元素 可以使用元素名(如 div 或者 p)来生成 HTML 标签.Emmet 没有预定义的有效元素名的 ...

  6. redis中如何对 key 进行分类

    因为redis中的 hash是不支持设置过期时间的,如果我们要 设置过期时间,还要分类存储,可以用下面折中的方法 其实就是我们把 key 定义的有规律一些,通过在key的字符串内部 分类,上图只是因为 ...

  7. HDU 5640

    King's Cake Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  8. Coconuts HDU - 5925 二维离散化 自闭了

    TanBig, a friend of Mr. Frog, likes eating very much, so he always has dreams about eating. One day, ...

  9. 【题解】Weird journey Codeforces 788B 欧拉路

    传送门:http://codeforces.com/contest/788/problem/B 好题!好题! 首先图不连通的时候肯定答案是0,我们下面讨论图联通的情况 首先考虑,如果我们每条边都经过两 ...

  10. [技巧篇]11.JavaScript原生态如何获取浏览器请求地址中的参数

    var getAccessParams = function(){ var i,ilen,strs,keyName,keyValue, params={}, path = window.locatio ...