Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

網站會不定期發佈技術筆記、職場心得相關的內容,歡迎關注本站!

網站
首頁關於我部落格
部落格
分類系列文

© 新人日誌. All rights reserved. 2020-present.

Django-storages 的完整配置教學:從隱密性到快取控制

最後更新:2024年12月18日Python

本文為 圖片上傳 AWS S3 系列教學,第 15 篇:

  1. AWS S3 是什麼?
  2. boto3 與 django-storages:如何在 Django 中對接 AWS S3
  3. AWS S3 與 IAM:圖片上傳功能的權限管理指南
  4. S3 與 Postgres 的比較與應用
  5. Amazon S3 物件所有權設定解析
  6. AWS S3「阻止所有公開訪問」設定說明
  7. Amazon S3 儲存桶版本控制完整指南
  8. 如何設定 S3 儲存桶的「預設加密」?—— 初學者指南
  9. S3 儲存桶標籤(Tags)簡單介紹:讓你的 S3 管理更輕鬆!
  10. AWS S3 物件鎖定功能入門指南
  11. AWS S3 公開存取權完整指南
  12. AWS CORS 預檢請求與設定指南
  13. AWS IAM 設定教學:生成訪問密鑰以用於 S3 配置
  14. django-storages 基本配置:讓應用程式連接 S3 存儲桶
  15. Django-storages 的完整配置教學:從隱密性到快取控制 👈 所在位置
  16. Django-storages 完整配置指南:從文件存儲到訪問路徑
  17. Django-storages 配置:環境變數設定
  18. Django-storages 與 STORAGES 配置:未來相容性的最佳實踐
  19. 如何在 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

簡單明瞭,適合公開訪問的文件。

兩個設定如何配合工作?

  1. AWS_DEFAULT_ACL = None:讓文件是否上鎖的決定權交給 S3 存儲桶的訪問策略。
  2. AWS_QUERYSTRING_AUTH = False:讓公開的文件可以用簡單的 URL 訪問,而不需要臨時鑰匙。

生活化總結:

  • S3 存儲桶 是你的房子,房門的開放與否由房東(S3 Bucket 策略)決定。
  • AWS_DEFAULT_ACL = None:上傳時不給文件加鎖,遵守房東的規定。
  • AWS_QUERYSTRING_AUTH = False:公開的房子讓訪客可以自由進入,不需要臨時鑰匙。

範例:公開用戶頭像的配置流程

  1. 設置 S3 存儲桶為公開讀取,允許任何人查看。
  2. 設置 AWS_DEFAULT_ACL = None,確保上傳文件時不自動上鎖。
  3. 設置 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 天
}

注意事項

  1. 公開與隱密的平衡:
    • 確保文件的公開與隱密設定符合業務需求,不要誤將敏感文件設為公開。
  2. 緩存與更新的平衡:
    • 若需要頻繁更新文件,建議結合文件版本化策略,避免用戶加載舊文件。
  3. 安全性建議:
    • 禁止將密鑰寫入程式碼中,應使用環境變數來管理。

結論

配置 django-storages 時,確保文件訪問權限的靈活性與緩存控制的高效性,是打造高性能且安全的網站的關鍵。

快速回顧

  1. 公開訪問文件:
    • AWS_DEFAULT_ACL = None:不上鎖,由 S3 規則決定。
    • AWS_QUERYSTRING_AUTH = False:生成乾淨的公開 URL。
  2. 提升性能:
    • 使用 CacheControl 設置緩存,提高加載速度。
  3. 進階技巧:
    • 文件版本化,避免緩存帶來的更新問題。
目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

Python

目錄

  • 確保文件的公開與隱密控制
  • 禁止上傳時主動加鎖:AWS_DEFAULT_ACL = None
  • 簡化訪問 URL:AWS_QUERYSTRING_AUTH = False
  • 兩個設定如何配合工作?
  • 文件快取控制:提升網站性能
  • 緩存控制的作用
  • 適用場景
  • 配置小結與最佳實踐
  • 推薦配置
  • 注意事項
  • 結論
  • 快速回顧