另見
django.contrib.staticfiles的用法簡(jiǎn)介,請(qǐng)參見管理靜態(tài)文件(CSS、images)。
放置靜態(tài)文件到線上環(huán)境的基本步驟很簡(jiǎn)單:當(dāng)靜態(tài)文件改變時(shí),運(yùn)行collectstatic 命令,然后安排將收集好的靜態(tài)文件的目錄(STATIC_ROOT) 搬到靜態(tài)文件服務(wù)器上。取決于STATICFILES_STORAGE,這些文件可能需要手工移動(dòng)到一個(gè)新的位置或者Storage 類的post_process 方法可以幫你。
當(dāng)然,與所有的部署任務(wù)一樣,魔鬼隱藏在細(xì)節(jié)中。每個(gè)線上環(huán)境的建立都會(huì)有所不同,所以你需要調(diào)整基本的綱要以適應(yīng)你的需求。下面是一些常見的方法,可能有所幫助。
如果你的靜態(tài)文件和網(wǎng)站位于同一臺(tái)服務(wù)器,流程可能像是這樣:
collectstatic 來收集所有的靜態(tài)文件到STATIC_ROOT。STATIC_URL下的STATIC_ROOT。 例如,這是如何使用Apache 和mod_wsgi 來完成它。你可能想自動(dòng)化這個(gè)過程,特別是如果你有多臺(tái)Web 服務(wù)器。有許多種方法來完成這個(gè)自動(dòng)化,但是許多Django 開發(fā)人員喜歡 Fabric。
在一下的小節(jié)中,我們將演示一些示例的Fabric 腳本來自動(dòng)化不同選擇的文件部署。Fabric 腳本的語(yǔ)法相當(dāng)簡(jiǎn)單,但這里不會(huì)講述;參見Fabric 的文檔 以獲得其語(yǔ)法的完整解釋。
所以,一個(gè)部署靜態(tài)文件來多臺(tái)Web 服務(wù)器上的Fabric 腳本大概會(huì)是:
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 站點(diǎn)都使用一臺(tái)單獨(dú)的Web 服務(wù)器來存放靜態(tài)文件 —— 例如一臺(tái)不運(yùn)行Django 的服務(wù)器。這種服務(wù)器通常運(yùn)行一種不同類型的服務(wù)器 —— 更快但是功能很少。一些常見的選擇有:
配置這些服務(wù)器在這篇文檔范圍之外;查看每種服務(wù)器各自的文檔以獲得說明。
既然你的靜態(tài)文件服務(wù)器不會(huì)允許Django,你將需要修改的部署策略,大概會(huì)是這樣:
collectstatic。STATIC_ROOT 推送到靜態(tài)文件服務(wù)器相應(yīng)的目錄中。在這一步,常見的選擇rsync ,因?yàn)樗粋鬏旍o態(tài)文件改變的部分。下面是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
)
兩位一個(gè)常見的策略是放置靜態(tài)文檔到一個(gè)云存儲(chǔ)提供商比如亞馬遜的S3 和/或一個(gè)CDN(Content Delivery Network)上。這讓你可以忽略保存靜態(tài)文件的問題,并且通??梢约涌炀W(wǎng)頁(yè)的加載(特別是使用CDN 的時(shí)候)。
當(dāng)使用這些服務(wù)時(shí),除了不是使用rsync 傳輸你的靜態(tài)文件到服務(wù)器上而是到存儲(chǔ)提供商或CDN 上之外,基本的工作流程和上面的差不多。
有許多方式可以實(shí)現(xiàn)它,但是如果提供商具有API,那么自定義的文件存儲(chǔ)后端 將使得這個(gè)過程相當(dāng)簡(jiǎn)單。如果你已經(jīng)寫好或者正在使用第三方的自定義存儲(chǔ)后端,你可以通過設(shè)置STATICFILES_STORAGE 來告訴collectstatic 來使用它。
例如,如果你已經(jīng)在myproject.storage.S3Storage 中寫好一個(gè)S3 存儲(chǔ)的后端,你可以這樣使用它:
STATICFILES_STORAGE = 'myproject.storage.S3Storage'
一旦完成這個(gè),你所要做的就是運(yùn)行collectstatic,然后你的靜態(tài)文件將被你的存儲(chǔ)后端推送到S3 上。如果以后你需要切換到一個(gè)不同的存儲(chǔ)提供商,你只需簡(jiǎn)單地修改你的STATICFILES_STORAGE 設(shè)置。
關(guān)于如何編寫這些后端的細(xì)節(jié),請(qǐng)參見編寫一個(gè)自定義的存儲(chǔ)系統(tǒng)。有第三方的應(yīng)用提供存儲(chǔ)后端,它們支持許多常見的文件存儲(chǔ)API。一個(gè)不錯(cuò)的入口是djangopackages.com 的概覽。
關(guān)于django.contrib.staticfiles 中包含的設(shè)置、命令、模板標(biāo)簽和其它細(xì)節(jié),參見staticfiles 參考。
譯者:Django 文檔協(xié)作翻譯小組,原文:Deploying static files。
本文以 CC BY-NC-SA 3.0 協(xié)議發(fā)布,轉(zhuǎn)載請(qǐng)保留作者署名和文章出處。
Django 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。交流群:467338606。