django 1.8 官方文档翻译: 6-6-4 部署静态文件
部署静态文件
另见
django.contrib.staticfiles
的用法简介,请参见管理静态文件(CSS、images)。
在线上环境部署静态文件
放置静态文件到线上环境的基本步骤很简单:当静态文件改变时,运行collectstatic
命令,然后安排将收集好的静态文件的目录(STATIC_ROOT
) 搬到静态文件服务器上。取决于STATICFILES_STORAGE
,这些文件可能需要手工移动到一个新的位置或者Storage
类的post_process
方法可以帮你。
当然,与所有的部署任务一样,魔鬼隐藏在细节中。每个线上环境的建立都会有所不同,所以你需要调整基本的纲要以适应你的需求。下面是一些常见的方法,可能有所帮助。
网站和静态文件位于同一台服务器上
如果你的静态文件和网站位于同一台服务器,流程可能像是这样:
- 将你的代码推送到部署的服务器上。
- 在这台服务器上,运行
collectstatic
来收集所有的静态文件到STATIC_ROOT
。 - 配置Web 服务器来托管URL
STATIC_URL
下的STATIC_ROOT
。 例如,这是如何使用Apache 和mod_wsgi 来完成它。
你可能想自动化这个过程,特别是如果你有多台Web 服务器。有许多种方法来完成这个自动化,但是许多Django 开发人员喜欢 Fabric。
在一下的小节中,我们将演示一些示例的Fabric 脚本来自动化不同选择的文件部署。Fabric 脚本的语法相当简单,但这里不会讲述;参见Fabric 的文档 以获得其语法的完整解释。
所以,一个部署静态文件来多台Web 服务器上的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 站点都使用一台单独的Web 服务器来存放静态文件 —— 例如一台不运行Django 的服务器。这种服务器通常运行一种不同类型的服务器 —— 更快但是功能很少。一些常见的选择有:
- Nginx
- 裁剪版的Apache
配置这些服务器在这篇文档范围之外;查看每种服务器各自的文档以获得说明。
既然你的静态文件服务器不会允许Django,你将需要修改的部署策略,大概会是这样:
- 当静态文件改变时,在本地运行
collectstatic
。 - 将你本地的
STATIC_ROOT
推送到静态文件服务器相应的目录中。在这一步,常见的选择rsync ,因为它只传输静态文件改变的部分。
下面是Fabric 脚本大概的样子:
from fabric.api import *
from fabric.contrib import project# Where the static files get collected locally. Your STATIC_ROOT setting.
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.rsync_project(remote_dir = env.remote_static_root,local_dir = env.local_static_root,delete = True)
静态文件位于一个云服务或CDN 上
两位一个常见的策略是放置静态文档到一个云存储提供商比如亚马逊的S3 和/或一个CDN(Content Delivery Network)上。这让你可以忽略保存静态文件的问题,并且通常可以加快网页的加载(特别是使用CDN 的时候)。
当使用这些服务时,除了不是使用rsync 传输你的静态文件到服务器上而是到存储提供商或CDN 上之外,基本的工作流程和上面的差不多。
有许多方式可以实现它,但是如果提供商具有API,那么自定义的文件存储后端 将使得这个过程相当简单。如果你已经写好或者正在使用第三方的自定义存储后端,你可以通过设置STATICFILES_STORAGE
来告诉collectstatic
来使用它。
例如,如果你已经在myproject.storage.S3Storage
中写好一个S3 存储的后端,你可以这样使用它:
STATICFILES_STORAGE = 'myproject.storage.S3Storage'
一旦完成这个,你所要做的就是运行collectstatic
,然后你的静态文件将被你的存储后端推送到S3 上。如果以后你需要切换到一个不同的存储提供商,你只需简单地修改你的STATICFILES_STORAGE
设置。
关于如何编写这些后端的细节,请参见编写一个自定义的存储系统。有第三方的应用提供存储后端,它们支持许多常见的文件存储API。一个不错的入口是djangopackages.com 的概览。
了解更多
关于django.contrib.staticfiles
中包含的设置、命令、模板标签和其它细节,参见staticfiles 参考。
译者:Django 文档协作翻译小组,原文:Deploying static files。
本文以 CC BY-NC-SA 3.0 协议发布,转载请保留作者署名和文章出处。
Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606。
django 1.8 官方文档翻译: 6-6-4 部署静态文件相关推荐
- Django+Nginx部署静态文件
通过Nginx部署Django项目时,需要通过Nginx来部署静态文件.具体操作如下: 设置static根目录 在项目的setting.py中"STATIC_URL = '/static/' ...
- django 1.8 官方文档翻译: 1-2-6 编写你的第一个Django应用,第6部分
编写你的第一个Django应用,第6部分 本教程上接教程 5. 我们已经建立一个测试过的网页投票应用,现在我们将添加一张样式表和一张图片. 除了由服务器生成的HTML文件外,网页应用一般需要提供其它必 ...
- django 1.8 官方文档翻译: 2-5-7 自定义查找
自定义查找 New in Django 1.7. Django为过滤提供了大量的内建的查找(例如,exact和icontains).这篇文档阐述了如何编写自定义查找,以及如何修改现存查找的功能.关于查 ...
- django 1.8 官方文档翻译:5-2-2 表单素材 ( Media 类)
表单素材 ( Media 类) 渲染有吸引力的.易于使用的web表单不仅仅需要HTML – 同时也需要CSS样式表,并且,如果你打算使用奇妙的web2.0组件,你也需要在每个页面包含一些JavaScr ...
- django 1.8 官方文档翻译: 3-3-4 管理文件
管理文件 这篇文档描述了Django为那些用户上传文件准备的文件访问API.底层的API足够通用,你可以使用为其它目的来使用它们.如果你想要处理静态文件(JS,CSS,以及其他),参见管理静态文件(C ...
- django 1.8 官方文档翻译: 3-3-3 文件储存API
文件储存API 获取当前的储存类 Django提供了两个便捷的方法来获取当前的储存类: class DefaultStorage[source] DefaultStorage 提供对当前的默认储存系统 ...
- django 1.8 官方文档翻译: 1-2-5 编写你的第一个Django应用,第5部分
编写你的第一个Django应用,第5部分 本教程上接教程第4部分. 我们已经建立一个网页投票应用,现在我们将为它创建一些自动化测试. 自动化测试简介 什么是自动化测试? 测试是检查你的代码是否正常运行 ...
- django 1.8 官方文档翻译: 1-1-1 Django初探
Django 初探 由于Django是在一个快节奏的新闻编辑室环境下开发出来的,因此它被设计成让普通的网站开发工作简单而快 捷.以下简单介绍了如何用 Django 编写一个数据库驱动的Web应用程序. ...
- django 1.8 官方文档翻译: 3-2-1 内建的视图
内建的视图 有几个Django 的内建视图在编写视图 中讲述,文档的其它地方也会有所讲述. 开发环境中的文件服务器 static.serve(request, path, document_root, ...
最新文章
- 环境变量太大解决方法
- python小程序-整理了适合新手的20个Python练手小程序
- linux redis 3.0.7,linux虚拟机上安装配置redis3.0.7
- STL set容器的一点总结
- 搜索旋转排序数组—leetcode31
- 索引会自动更新吗_mysql的B+树中数据存放结构和索引常见问题你会吗?
- SQL Server 触发器 详细讲解
- 探寻C++最快的读取文件的方案
- 了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发)
- 业务重点-实现一个简单的手机号码验证
- 关于Chrome浏览器(Chrome Stable、 Chrome Canary 、Chromium)
- Android时间轴,RecyclerView实现
- pr 快捷键自我需要总结
- 全球与中国钠还原剂市场深度研究分析报告
- 【PC工具】文字文本朗读工具,语音朗读软件,TTS语音合成
- 实现点击按钮 复制文本内容
- 分布式事务--TX-LCN(介绍)
- win7修复计算机消失,win7系统引导文件丢失的修复妙招
- android sqlite fts4,FTS4 sqlite MATCH查询不起作用(FTS4 sqlite MATCH query not working)
- Linux都应用在哪些领域?发展如何?
热门文章
- 【AD】AD20差分等长布线
- 一文简单理解Java反射及使用
- Oracle01877,Cognos错误:RQP-DEF-0177 执行操作“sqlOpenResult”(状态为“-28”)时出错...
- 《深入理解 Spring Cloud 与微服务构建》第十八章 使用 Spring Security OAuth2 和 JWT 保护微服务系统
- 力扣21.合并有序链表
- 做个环保主义的程序员
- MySQL---数据库切分
- c#发送邮件,可发送多个附件
- C# 输入一个整数,求质因数
- 在java中使用ffmpeg将amr格式的语音转为mp3格式