django 1.8 官方文檔翻譯: 6-6-4 部署靜態文件

部署靜態文件

另見html

django.contrib.staticfiles 的用法簡介,請參見管理靜態文件(CSS、images)python

在線上環境部署靜態文件

放置靜態文件到線上環境的基本步驟很簡單:當靜態文件改變時,運行collectstatic 命令,而後安排將收集好的靜態文件的目錄(STATIC_ROOT) 搬到靜態文件服務器上。取決於STATICFILES_STORAGE,這些文件可能須要手工移動到一個新的位置或者Storage 類的post_process 方法能夠幫你。nginx

固然,與全部的部署任務同樣,魔鬼隱藏在細節中。每一個線上環境的創建都會有所不一樣,因此你須要調整基本的綱要以適應你的需求。下面是一些常見的方法,可能有所幫助。apache

網站和靜態文件位於同一臺服務器上

若是你的靜態文件和網站位於同一臺服務器,流程可能像是這樣:django

  • 將你的代碼推送到部署的服務器上。後端

  • 在這臺服務器上,運行collectstatic 來收集全部的靜態文件到STATIC_ROOTapi

  • 配置Web 服務器來託管URL STATIC_URL下的STATIC_ROOT。 例如,這是如何使用Apache 和mod_wsgi 來完成它服務器

你可能想自動化這個過程,特別是若是你有多臺Web 服務器。有許多種方法來完成這個自動化,可是許多Django 開發人員喜歡 Fabricpost

在一下的小節中,咱們將演示一些示例的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 的服務器。這種服務器一般運行一種不一樣類型的服務器 —— 更快可是功能不多。一些常見的選擇有:

配置這些服務器在這篇文檔範圍以外;查看每種服務器各自的文檔以得到說明。

既然你的靜態文件服務器不會容許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。

相關文章
相關標籤/搜索