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

更新日期: 2024 年 12 月 18 日

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

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

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


本機環境:使用 MEDIA_ROOTMEDIA_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
  • 訪問 URLhttp://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_ROOTMEDIA_URL
S3 儲存AWS S3 的 /media/https://your-bucket.s3.amazonaws.com/media/MEDIA_URLDEFAULT_FILE_STORAGE

如何正確切換到 AWS S3

移除本機存儲設定

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

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

更新 MEDIA_URLDEFAULT_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_URLDEFAULT_FILE_STORAGE,並根據需求調整訪問權限與快取策略。

快速回顧

  1. 本機存儲:使用 MEDIA_ROOTMEDIA_URL
  2. S3 存儲:使用 DEFAULT_FILE_STORAGE 和 AWS 相關配置。
  3. 訪問權限:設置 AWS_DEFAULT_ACL = NoneAWS_QUERYSTRING_AUTH = False
  4. 性能優化:啟用文件緩存控制,提升加載速度。

Similar Posts