Django-storages 完整配置指南:從文件存儲到訪問路徑
更新日期: 2024 年 12 月 18 日
本文為 圖片上傳 AWS S3 系列教學,第 16 篇:
- 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 的靜態檔案配置
建議閱讀本文前,先閱讀完 圖片上傳功能 系列文
當使用 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 |
如何正確切換到 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'
注意事項與最佳實踐
- 確保 S3 存儲桶權限設置正確
- 如果文件是公開訪問的,確保存儲桶的訪問策略允許公開讀取。
- 環境變數管理密鑰
- 不要將 AWS 憑證硬編碼在程式中,應使用環境變數或
.env
文件管理密鑰。
- 不要將 AWS 憑證硬編碼在程式中,應使用環境變數或
- 檔案版本化與緩存更新
- 如果文件會頻繁更新,使用文件版本化策略來避免用戶加載舊的快取文件。例如,為每個新文件生成唯一文件名。
結論
Django-storages 提供了一個靈活的方式,幫助你將文件存儲從本機切換到 AWS S3。在配置過程中,關鍵是正確設置 MEDIA_URL
和 DEFAULT_FILE_STORAGE
,並根據需求調整訪問權限與快取策略。
快速回顧
- 本機存儲:使用
MEDIA_ROOT
和MEDIA_URL
。 - S3 存儲:使用
DEFAULT_FILE_STORAGE
和 AWS 相關配置。 - 訪問權限:設置
AWS_DEFAULT_ACL = None
和AWS_QUERYSTRING_AUTH = False
。 - 性能優化:啟用文件緩存控制,提升加載速度。