本文為 圖片上傳 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 中。