Django-storages 配置:環境變數設定
更新日期: 2024 年 12 月 18 日
本文為 圖片上傳 AWS S3 系列教學,第 17 篇:
- 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 應用程式時,使用 .env
文件來管理敏感資訊(例如 AWS 憑證)是一種最佳實踐。
配合 django-storages
和 AWS S3,可以實現安全高效的文件存儲與訪問。
本篇文章將詳細介紹如何使用 .env
文件及 python-dotenv
工具來管理環境變數,並進一步結合 AWS S3 的設置,打造完善的文件存儲方案。
為什麼需要 .env
文件
.env
文件的主要作用是集中管理敏感的環境變數,例如:
- AWS 憑證 (
AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
) - S3 Bucket 名稱 (
AWS_STORAGE_BUCKET_NAME
) - 自定義域名或其他相關配置
好處
- 安全性:避免將敏感資訊硬編碼到程式碼中。
- 靈活性:能輕鬆切換不同環境的配置,例如開發環境與生產環境。
- 可共享性:通過
.env.example
為其他開發者提供配置範本。
配置 .env
文件
創建 .env
文件
在專案根目錄下建立 .env
文件,並填入 AWS 的相關憑證:
AWS_ACCESS_KEY_ID=your-access-key-id
AWS_SECRET_ACCESS_KEY=your-secret-access-key
AWS_STORAGE_BUCKET_NAME=your-bucket-name
AWS_S3_REGION_NAME=ap-northeast-1
創建 .env.example
文件(非必須,但建議)
.env.example
是 .env
文件的模板,供其他開發者參考,內容示例如下:
AWS_ACCESS_KEY_ID=your-access-key-id
AWS_SECRET_ACCESS_KEY=your-secret-access-key
AWS_STORAGE_BUCKET_NAME=your-bucket-name
AWS_S3_REGION_NAME=your-region-name
注意:不要將
.env
文件提交到版本控制系統,而應提交.env.example
文件,指導團隊如何設置環境變數。
確保 Django 能讀取 .env
文件中的變數
加載 .env
文件
方法一:手動設置環境變數
手動將 .env
文件中的變數加載到系統環境中:
- Linux/macOS:
將.env
文件內容添加到~/.bashrc
或~/.zshrc
,然後運行:source ~/.bashrc # 或 source ~/.zshrc
- Windows:
在系統「環境變數」設置界面,手動添加每個變數。
方法二:使用 python-dotenv
工具(推薦)
python-dotenv
是一個工具,能自動將 .env
文件中的變數加載到系統環境變數中。
步驟如下:
- 安裝
python-dotenv
:
pip install python-dotenv
- 在
settings.py
文件的開頭加載.env
文件:
from dotenv import load_dotenv
import os
# 加載 .env 文件
load_dotenv()
AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.getenv('AWS_STORAGE_BUCKET_NAME')
AWS_S3_REGION_NAME = os.getenv('AWS_S3_REGION_NAME')
注意事項與常見問題
確保 .env
文件被正確加載
- 如果未使用
python-dotenv
,請手動檢查.env
文件中的變數是否已載入系統環境:echo $AWS_ACCESS_KEY_ID
如果未返回正確值,請確認是否正確加載.env
文件。
.env.example
的作用
.env.example
不會影響程式運行,它僅作為範本,指導開發者正確設置.env
文件。- 在部署專案時,需將
.env.example
文件的內容複製到.env
文件,並填寫實際值。
測試環境變數讀取
啟動 Django 開發伺服器,並檢查變數是否正確讀取:
python manage.py runserver
如果一切正確,應該可以正常上傳文件至 S3,並生成可訪問的文件 URL。
設定總結與最佳實踐
.env
文件設定
AWS_ACCESS_KEY_ID=your-access-key-id
AWS_SECRET_ACCESS_KEY=your-secret-access-key
AWS_STORAGE_BUCKET_NAME=your-bucket-name
AWS_S3_REGION_NAME=ap-northeast-1
Django 配置範例
from dotenv import load_dotenv
import os
load_dotenv()
AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.getenv('AWS_STORAGE_BUCKET_NAME')
AWS_S3_REGION_NAME = os.getenv('AWS_S3_REGION_NAME')
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
AWS_DEFAULT_ACL = None
AWS_QUERYSTRING_AUTH = False
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
最佳實踐
- 使用
.env
管理敏感資訊,避免硬編碼到程式碼中。 - 提供
.env.example
作為配置範本,幫助團隊快速部署。 - 使用
python-dotenv
自動加載.env
文件,簡化本地開發環境配置。
結論
通過 .env
文件和 python-dotenv
的結合,你可以輕鬆管理環境變數,並將 AWS S3 文件存儲功能無縫集成到 Django 中。