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

更新日期: 2024 年 12 月 18 日

使用 AWS S3 作為文件儲存服務時,文件的公開訪問與隱密保護是兩大關鍵問題。

此外,為了提升網站性能,我們還需有效管理靜態文件的快取策略。

本篇文章將帶你深入了解如何利用 django-storages 完成這些配置,並結合生活化的例子說明每個設定的作用,幫助新手輕鬆上手。


確保文件的公開與隱密控制

以下兩個配置是處理文件訪問權限的核心:

AWS_DEFAULT_ACL = None  # 不主動加鎖,由 S3 Bucket 決定文件的公開與隱密
AWS_QUERYSTRING_AUTH = False  # 禁用查詢字符串驗證,讓訪問 URL 更簡單

禁止上傳時主動加鎖:AWS_DEFAULT_ACL = None

想像你的 S3 存儲桶 就像是一間房子,而房子的門(文件權限)可以上鎖或開放:

  • 一般情況:每次你將文件放進房子裡,房東會默認給文件上鎖(比如 public-readprivate)。
  • 設置 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. 進階技巧
    • 文件版本化,避免緩存帶來的更新問題。

Similar Posts