Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

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

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

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

Django-storages 完整配置指南:從文件存儲到訪問路徑

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

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

  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 的靜態檔案配置

建議閱讀本文前,先閱讀完 圖片上傳功能 系列文

當使用 Django 開發應用程式時,處理用戶上傳的文件是不可避免的工作。

在本機開發環境中,文件通常保存在本地目錄中。但在生產環境中,為了提升性能、擴展性和安全性,將文件存儲在 AWS S3 等雲端服務是更好的選擇。

本篇文章將帶你了解如何從本機文件存儲切換到 AWS S3,包括路徑設定、訪問控制以及相關配置的詳細解析。


本機環境:使用 MEDIA_ROOT 和 MEDIA_URL

在本機開發環境中,Django 通常使用內建的檔案系統來存儲用戶上傳的文件。以下是典型的設定:

MEDIA_URL = "/media/"
MEDIA_ROOT = BASE_DIR / "media"

配置詳解

  • MEDIA_ROOT:
    定義 Django 將用戶上傳文件存儲在哪個目錄。例如,所有文件將存儲在專案目錄下的 media/ 資料夾中。
  • MEDIA_URL:
    定義文件的訪問路徑前綴。例如,訪問本機文件的 URL 可能是 http://localhost:8000/media/your_file.jpg。

使用場景

本機開發環境中,這種設置足夠應付簡單的文件上傳需求。例如:

  • 小型專案或測試應用程式。
  • 用戶上傳文件僅需要臨時保存,不涉及多機部署。

結果範例

  • 文件存儲位置:media/your_file.jpg
  • 訪問 URL:http://localhost:8000/media/your_file.jpg

生產環境:切換到 AWS S3 儲存

在生產環境中,為了提高存儲可靠性、擴展性以及訪問速度,通常會將文件存儲到 AWS S3。以下是相關配置:

MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

配置詳解

  • DEFAULT_FILE_STORAGE:
    告訴 Django 使用 AWS S3 作為文件存儲後端,而非本地的 MEDIA_ROOT。

    所有上傳的文件都將儲存在指定的 S3 Bucket 中。
  • MEDIA_URL:
    指定文件的訪問 URL 前綴,讓應用程式生成的文件鏈接指向 S3 上的存儲位置。

    例如: https://your-bucket-name.s3.amazonaws.com/media/your_file.jpg

將設定應用於 S3

以下是完整的 AWS S3 配置範例:

AWS_ACCESS_KEY_ID = '你的 AWS Access Key ID'
AWS_SECRET_ACCESS_KEY = '你的 AWS Secret Access Key'
AWS_STORAGE_BUCKET_NAME = 'your-bucket-name'
AWS_S3_REGION_NAME = 'ap-northeast-1'  # 指定 S3 存儲桶區域
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'

MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

本機與 S3 配置的對比

環境存儲位置訪問路徑設定
本機開發本機 /media/http://localhost:8000/media/MEDIA_ROOT 和 MEDIA_URL
S3 儲存AWS S3 的 /media/https://your-bucket.s3.amazonaws.com/media/MEDIA_URL 和 DEFAULT_FILE_STORAGE
存儲位置本機 /media/
訪問路徑http://localhost:8000/media/
設定MEDIA_ROOT 和 MEDIA_URL
存儲位置AWS S3 的 /media/
訪問路徑https://your-bucket.s3.amazonaws.com/media/
設定MEDIA_URL 和 DEFAULT_FILE_STORAGE

如何正確切換到 AWS S3

移除本機存儲設定

當使用 AWS S3 作為文件存儲後端時,MEDIA_ROOT 將不再需要:

# 移除本機配置
# MEDIA_ROOT = BASE_DIR / "media"

更新 MEDIA_URL 和 DEFAULT_FILE_STORAGE

確保 Django 能正確連接到 S3:

MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

設定的實踐範例

以下是完整的 S3 配置範例,整合了文件存儲、訪問權限與緩存控制:

AWS_ACCESS_KEY_ID = '你的 AWS Access Key ID'
AWS_SECRET_ACCESS_KEY = '你的 AWS Secret Access Key'
AWS_STORAGE_BUCKET_NAME = 'your-bucket-name'
AWS_S3_REGION_NAME = 'ap-northeast-1'
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'

# 文件訪問控制
AWS_DEFAULT_ACL = None  # 不主動加鎖
AWS_QUERYSTRING_AUTH = False  # 簡化 URL 訪問

# 文件緩存控制
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',  # 緩存時間 1 天
}

# 媒體文件存儲
MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

注意事項與最佳實踐

  1. 確保 S3 存儲桶權限設置正確
    • 如果文件是公開訪問的,確保存儲桶的訪問策略允許公開讀取。
  2. 環境變數管理密鑰
    • 不要將 AWS 憑證硬編碼在程式中,應使用環境變數或 .env 文件管理密鑰。
  3. 檔案版本化與緩存更新
    • 如果文件會頻繁更新,使用文件版本化策略來避免用戶加載舊的快取文件。例如,為每個新文件生成唯一文件名。

結論

Django-storages 提供了一個靈活的方式,幫助你將文件存儲從本機切換到 AWS S3。在配置過程中,關鍵是正確設置 MEDIA_URL 和 DEFAULT_FILE_STORAGE,並根據需求調整訪問權限與快取策略。

快速回顧

  1. 本機存儲:使用 MEDIA_ROOT 和 MEDIA_URL。
  2. S3 存儲:使用 DEFAULT_FILE_STORAGE 和 AWS 相關配置。
  3. 訪問權限:設置 AWS_DEFAULT_ACL = None 和 AWS_QUERYSTRING_AUTH = False。
  4. 性能優化:啟用文件緩存控制,提升加載速度。
目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

Python

目錄

  • 本機環境:使用 MEDIA_ROOT 和 MEDIA_URL
  • 配置詳解
  • 使用場景
  • 結果範例
  • 生產環境:切換到 AWS S3 儲存
  • 配置詳解
  • 將設定應用於 S3
  • 本機與 S3 配置的對比
  • 如何正確切換到 AWS S3
  • 移除本機存儲設定
  • 更新 MEDIA_URL 和 DEFAULT_FILE_STORAGE
  • 設定的實踐範例
  • 注意事項與最佳實踐
  • 結論
  • 快速回顧