# 部署靜態文件 #
> 另見
>
> `django.contrib.staticfiles` 的用法簡介,請參見[管理靜態文件(CSS、images)](http://python.usyiyi.cn/django/howto/static-files/index.html)。
## 在線上環境部署靜態文件 ##
放置靜態文件到線上環境的基本步驟很簡單:當靜態文件改變時,運行`collectstatic` 命令,然后安排將收集好的靜態文件的目錄(`STATIC_ROOT`) 搬到靜態文件服務器上。取決于`STATICFILES_STORAGE`,這些文件可能需要手工移動到一個新的位置或者`Storage` 類的`post_process` 方法可以幫你。
當然,與所有的部署任務一樣,魔鬼隱藏在細節中。每個線上環境的建立都會有所不同,所以你需要調整基本的綱要以適應你的需求。下面是一些常見的方法,可能有所幫助。
### 網站和靜態文件位于同一臺服務器上 ###
如果你的靜態文件和網站位于同一臺服務器,流程可能像是這樣:
+ 將你的代碼推送到部署的服務器上。
+ 在這臺服務器上,運行`collectstatic` 來收集所有的靜態文件到`STATIC_ROOT`。
+ 配置Web 服務器來托管URL` STATIC_URL`下的`STATIC_ROOT`。 例如,這是[如何使用Apache 和mod_wsgi 來完成它](http://python.usyiyi.cn/django/howto/deployment/wsgi/modwsgi.html#serving-files)。
你可能想自動化這個過程,特別是如果你有多臺Web 服務器。有許多種方法來完成這個自動化,但是許多Django 開發人員喜歡 [Fabric](http://fabfile.org/)。
在一下的小節中,我們將演示一些示例的Fabric 腳本來自動化不同選擇的文件部署。Fabric 腳本的語法相當簡單,但這里不會講述;參見[Fabric 的文檔](http://docs.fabfile.org/) 以獲得其語法的完整解釋。
所以,一個部署靜態文件來多臺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](http://wiki.nginx.org/Main)
+ 裁剪版的[Apache](http://httpd.apache.org/)
配置這些服務器在這篇文檔范圍之外;查看每種服務器各自的文檔以獲得說明。
既然你的靜態文件服務器不會允許Django,你將需要修改的部署策略,大概會是這樣:
+ 當靜態文件改變時,在本地運行`collectstatic`。
+ 將你本地的`STATIC_ROOT` 推送到靜態文件服務器相應的目錄中。在這一步,常見的選擇[rsync](https://rsync.samba.org/) ,因為它只傳輸靜態文件改變的部分。
下面是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` 設置。
關于如何編寫這些后端的細節,請參見[編寫一個自定義的存儲系統](http://python.usyiyi.cn/django/howto/custom-file-storage.html)。有第三方的應用提供存儲后端,它們支持許多常見的文件存儲API。一個不錯的入口是[djangopackages.com 的概覽](https://www.djangopackages.com/grids/g/storage-backends/)。
## 了解更多 ##
關于`django.contrib.staticfiles` 中包含的設置、命令、模板標簽和其它細節,參見[staticfiles 參考](http://python.usyiyi.cn/django/ref/contrib/staticfiles.html)。
> 譯者:[Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html),原文:[Deploying static files](https://docs.djangoproject.com/en/1.8/howto/static-files/deployment/)。
>
> 本文以 [CC BY-NC-SA 3.0](http://creativecommons.org/licenses/by-nc-sa/3.0/cn/) 協議發布,轉載請保留作者署名和文章出處。
>
> [Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html)人手緊缺,有興趣的朋友可以加入我們,完全公益性質。交流群:467338606。
- 新手入門
- 從零開始
- 概覽
- 安裝
- 教程
- 第1部分:模型
- 第2部分:管理站點
- 第3部分:視圖和模板
- 第4部分:表單和通用視圖
- 第5部分:測試
- 第6部分:靜態文件
- 高級教程
- 如何編寫可重用的應用
- 為Django編寫首個補丁
- 模型層
- 模型
- 模型語法
- 元選項
- 模型類
- 查詢集
- 執行查詢
- 查找表達式
- 模型的實例
- 實例方法
- 訪問關聯對象
- 遷移
- 模式編輯器
- 編寫遷移
- 高級
- 管理器
- 原始的SQL查詢
- 聚合
- 多數據庫
- 自定義查找
- 條件表達式
- 數據庫函數
- 其它
- 遺留的數據庫
- 提供初始數據
- 優化數據庫訪問
- 視圖層
- 基礎
- URL配置
- 視圖函數
- 快捷函數
- 裝飾器
- 參考
- 內建的視圖
- TemplateResponse 對象
- 文件上傳
- 概覽
- File 對象
- 儲存API
- 管理文件
- 自定義存儲
- 基于類的視圖
- 概覽
- 內建顯示視圖
- 內建編輯視圖
- API參考
- 分類索引
- 高級
- 生成 CSV
- 生成 PDF
- 中間件
- 概覽
- 內建的中間件類
- 模板層
- 基礎
- 面向設計師
- 語言概覽
- 人性化
- 面向程序員
- 表單
- 基礎
- 概覽
- 表單API
- 內建的Widget
- 高級
- 整合媒體
- 開發過程
- 設置
- 概覽
- 應用程序
- 異常
- 概覽
- django-admin 和 manage.py
- 添加自定義的命令
- 測試
- 介紹
- 部署
- 概述
- WSGI服務器
- 部署靜態文件
- 通過email追蹤代碼錯誤
- Admin
- 管理操作
- 管理文檔生成器
- 安全
- 安全概述
- 說明Django中的安全問題
- 點擊劫持保護
- 加密簽名
- 國際化和本地化
- 概述
- 本地化WEB UI格式化輸入
- “本地特色”
- 常見的網站應用工具
- 認證
- 概覽
- 使用認證系統
- 密碼管理
- 日志
- 分頁
- 會話
- 數據驗證
- 其它核心功能
- 按需內容處理
- 重定向
- 信號
- 系統檢查框架