Django对静态文件的处理——部署阶段
来源:互联网 发布:区块链 拜占庭算法 编辑:程序博客网 时间:2024/05/09 10:07
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 目录下。
./manage.py collectstatic
当然了,你完全可以不用管这些,手动将你要用到的静态文件收集到一起,如果你的项目很小的话。staticfiles 只是一个可选工具,其本身也是在 1.3 之后才引入 Django 中,它的前身是 Django 的第三方工具包 django-staticfiles。
static 模板标签,用来生成静态文件的 URL 地址。这样当负责静态文件的服务器发生变动的时候,就不用一个个地改模板了。有以下几种方式:
直接在模板中使用 STATIC_URL 变量,比如
<img src="{{ STATIC_URL }}images/hi.jpg" />
当然这个变量不是凭空来的,它是 django.core.context_processors.static 提供的,默认已经在 TEMPLATE_CONTEXT_PROCESSORS 中开启了。因为用到了 context_processor,所以你需要在渲染模板的时候使用RequestContext ,如果你用的是 render_to_response,那么就是:
return render_to_response("some.html", {}, context_instance=RequestContext(request))
如果嫌 RequestContext 麻烦,你可以使用 get_static_prefix 这个内置的模板标签,效果是一样的:
{% load static %}<img src="{% get_static_prefix %}images/hi.jpg" />
你也可以用另外一个内置模板标签 static,同样不需要 RequestContext:
{% load static %}<img src="{% static "images/hi.jpg" %}" />
它实际上调用的是 Python 内置模块中的 urlparse.urljoin(),将 STATIC_URL 和 后面的 path 拼接到了一起。
还有一个同名但更强大的 static 模板标签,存在于之前提到过的 staticfiles 组件中,用法类似:
{% 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 来看待,这就是另外一个话题了。
- Django对静态文件的处理——部署阶段
- django对静态文件的处理方法
- Django 静态文件部署
- Django静态文件部署
- django部署静态文件的设置
- Django 部署 ubuntu uwsgi nginx 处理 静态文件
- django debug对静态文件的影响
- Django中对静态文件的支持
- Django中对静态文件的支持
- 用Aapache处理Django的静态文件
- django中静态文件的处理
- 让Nginx处理Django的静态文件
- Django 静态文件处理 三部曲
- Django静态文件处理总结
- Django静态文件处理总结
- Django静态文件处理总结
- django静态文件url处理
- heroku部署django之静态文件配置
- atc工具使用-国内运营商的网络环境
- POJ 1727 Advanced Causal Measurements (ACM)(二分+贪心)
- android计时demo源代码
- YUV格式分析详解
- 笔记115--app中引入网页(解决网页上Alert不响应的问题)
- Django对静态文件的处理——部署阶段
- Java Web文件下载
- c++ 读、写、保存、删除文件
- Ubuntu12.04编译hadoop2x-eclipse-plugin-master插件
- 捕鱼玩家断线时,经验错误和无金币记录(得到的金币为0,GSP_GR_WriteGameScoreLog存储过程不执行)
- Sublime Text3 + Golang搭建开发环境
- 一次Java垃圾收集调优实战
- 自动化运维工具Ansible详细部署
- Android调用百度地图可能导致出错的问题