Django-storages 的完整配置教學:從隱密性到快取控制
更新日期: 2024 年 12 月 18 日
本文為 圖片上傳 AWS S3 系列教學,第 15 篇:
- AWS S3 是什麼?
- boto3 與 django-storages:如何在 Django 中對接 AWS S3
- AWS S3 與 IAM:圖片上傳功能的權限管理指南
- S3 與 Postgres 的比較與應用
- Amazon S3 物件所有權設定解析
- AWS S3「阻止所有公開訪問」設定說明
- Amazon S3 儲存桶版本控制完整指南
- 如何設定 S3 儲存桶的「預設加密」?—— 初學者指南
- S3 儲存桶標籤(Tags)簡單介紹:讓你的 S3 管理更輕鬆!
- AWS S3 物件鎖定功能入門指南
- AWS S3 公開存取權完整指南
- AWS CORS 預檢請求與設定指南
- AWS IAM 設定教學:生成訪問密鑰以用於 S3 配置
- django-storages 基本配置:讓應用程式連接 S3 存儲桶
- Django-storages 的完整配置教學:從隱密性到快取控制 👈 所在位置
- Django-storages 完整配置指南:從文件存儲到訪問路徑
- Django-storages 配置:環境變數設定
- Django-storages 與 STORAGES 配置:未來相容性的最佳實踐
- 如何在 Django 中移除 DEBUG URL 的靜態檔案配置
建議閱讀本文前,先閱讀完 圖片上傳功能 系列文
使用 AWS S3 作為文件儲存服務時,文件的公開訪問與隱密保護是兩大關鍵問題。
此外,為了提升網站性能,我們還需有效管理靜態文件的快取策略。
本篇文章將帶你深入了解如何利用 django-storages
完成這些配置,並結合生活化的例子說明每個設定的作用,幫助新手輕鬆上手。
確保文件的公開與隱密控制
以下兩個配置是處理文件訪問權限的核心:
AWS_DEFAULT_ACL = None # 不主動加鎖,由 S3 Bucket 決定文件的公開與隱密
AWS_QUERYSTRING_AUTH = False # 禁用查詢字符串驗證,讓訪問 URL 更簡單
禁止上傳時主動加鎖:AWS_DEFAULT_ACL = None
想像你的 S3 存儲桶 就像是一間房子,而房子的門(文件權限)可以上鎖或開放:
- 一般情況:每次你將文件放進房子裡,房東會默認給文件上鎖(比如
public-read
或private
)。 - 設置
AWS_DEFAULT_ACL = None
:你告訴房東,「上鎖的事情由房子的規則(S3 Bucket 策略)來決定,我不動任何鎖。」
這個設定的目的是讓 S3 存儲桶的整體訪問規則優先,而不是依賴單個文件的設定。
簡化訪問 URL:AWS_QUERYSTRING_AUTH = False
仍以房子的例子來看:
- 如果房子是公開的(文件可供任何人訪問),一般訪客仍需要一把臨時的鑰匙(URL 上的查詢參數驗證,比如
?AWSAccessKey=...
)。 - 設置
AWS_QUERYSTRING_AUTH = False
:直接將房門打開,訪客可以通過簡單的 URL 直接訪問文件。
範例:
未禁用查詢字符串時的 URL:
https://my-bucket.s3.amazonaws.com/media/example.jpg?AWSAccessKey=...&Expires=...
禁用後的 URL:
https://my-bucket.s3.amazonaws.com/media/example.jpg
簡單明瞭,適合公開訪問的文件。
兩個設定如何配合工作?
AWS_DEFAULT_ACL = None
:讓文件是否上鎖的決定權交給 S3 存儲桶的訪問策略。AWS_QUERYSTRING_AUTH = False
:讓公開的文件可以用簡單的 URL 訪問,而不需要臨時鑰匙。
生活化總結:
- S3 存儲桶 是你的房子,房門的開放與否由房東(S3 Bucket 策略)決定。
AWS_DEFAULT_ACL = None
:上傳時不給文件加鎖,遵守房東的規定。AWS_QUERYSTRING_AUTH = False
:公開的房子讓訪客可以自由進入,不需要臨時鑰匙。
範例:公開用戶頭像的配置流程
- 設置 S3 存儲桶為公開讀取,允許任何人查看。
- 設置
AWS_DEFAULT_ACL = None
,確保上傳文件時不自動上鎖。 - 設置
AWS_QUERYSTRING_AUTH = False
,讓 URL 簡潔。
公開的頭像訪問 URL:
https://my-bucket.s3.amazonaws.com/media/user_profile.jpg
文件快取控制:提升網站性能
當文件是公開訪問時,進一步提升性能的重點在於快取。以下是常見的緩存控制配置:
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400', # 緩存時間為 1 天
}
緩存控制的作用
緩存控制可以告訴瀏覽器或中介服務器(如 CloudFront),文件的有效期多長時間,避免頻繁請求伺服器。
max-age=86400
:緩存時間設置為 86400 秒(即 1 天)。- 瀏覽器在緩存期內,會直接從本地緩存加載文件,而不向伺服器發送請求。
適用場景
推薦的使用情境:靜態文件
- 文件不會頻繁更改,例如:
- 網站的背景圖片、產品圖片。
- 用戶的固定頭像。
這些文件可以長時間緩存,提高加載速度,並降低伺服器負擔。
不推薦的使用情境:動態文件
- 文件頻繁更新,例如:
- 即時生成的報表圖片。
- 用戶經常更改的文件。
緩存可能導致訪客看到舊的文件內容。如果需要頻繁更新,應採用文件版本化策略(例如每次上傳生成唯一文件名)。
配置小結與最佳實踐
推薦配置
針對公開文件的常見場景(如用戶頭像或產品圖片),推薦以下配置:
AWS_DEFAULT_ACL = None # 不主動加鎖,由存儲桶規則決定
AWS_QUERYSTRING_AUTH = False # 簡化 URL,適合公開文件
AWS_S3_OBJECT_PARAMETERS = { # 設置緩存控制
'CacheControl': 'max-age=86400', # 緩存 1 天
}
注意事項
- 公開與隱密的平衡:
- 確保文件的公開與隱密設定符合業務需求,不要誤將敏感文件設為公開。
- 緩存與更新的平衡:
- 若需要頻繁更新文件,建議結合文件版本化策略,避免用戶加載舊文件。
- 安全性建議:
- 禁止將密鑰寫入程式碼中,應使用環境變數來管理。
結論
配置 django-storages
時,確保文件訪問權限的靈活性與緩存控制的高效性,是打造高性能且安全的網站的關鍵。
快速回顧
- 公開訪問文件:
AWS_DEFAULT_ACL = None
:不上鎖,由 S3 規則決定。AWS_QUERYSTRING_AUTH = False
:生成乾淨的公開 URL。
- 提升性能:
- 使用
CacheControl
設置緩存,提高加載速度。
- 使用
- 進階技巧:
- 文件版本化,避免緩存帶來的更新問題。