iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0

提到上傳檔案,就會牽涉到檔案系統。在單一機器的情況時,這沒什麼問題,檔案就是儲存在本機。但是,如果考慮到以橫向擴充的方式 (Scaling) 來擴充規模的話,就必須要把檔案儲存到外部服務去。

Django 早就已經考慮到這一點,所以它的檔案系統層是可以抽換的。預設是使用本地端的檔案系統 (FileSystemStorage),如果要使用 AWS S3、Azure storage 的話,得自己去實作 Storage backend 。而 django-storages 則是已經幫你做好了,提供了多種不同的檔案系統層實作,例如 AWS S3、Azure storage、Dropbox、Google Cloud storage 等等的,所以只要在設定裡把檔案系統層指定為所需的雲端存儲服務,在上傳檔案時,Django 就會把上傳的檔案放到雲端存儲服務去。

專案網址:https://django-storages.readthedocs.io/en/latest/index.html

安裝

poetry add django-storages

設定與使用

django-storages 實作了多個檔案系統層 (Storage backend),每個 Backend 的設定方法都會因為雲端存儲服務的不同而有點小小的差異。

目前 django-storages 實作了以下檔案系統層:

  • AWS S3 / monio
  • Apache libcloud
  • Azure storage
  • Digital Ocean
  • Dropbox
  • FTP
  • Google cloud storage
  • SFTP

AWS S3 / minio / Digital Ocean

S3Boto3Storage 主要是跟 AWS S3 溝通用的 storage backend,minio 與 Digital Ocean的 API 與 AWS S3 相容,所以也可以跟 minio / Digital Ocean 溝通。

這裡順帶簡單介紹一下 minio,minio 是一個 object storage ,跟 S3 一樣,是一個以路徑當作 key,以物件當作值的存儲系統,API 刻意設計的跟 AWS S3 一樣。所以想架個跟 S3 一樣的服務,就可以拿 minio 來架設。

下面就來介紹設定,主要的設定有這幾個

# settings
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_ACCESS_KEY_ID = 'your access key id'
AWS_SECRET_ACCESS_KEY = 'your secret access key'
AWS_STORAGE_BUCKET_NAME = 'your bucket name'
  • DEFAULT_FILE_STORAGE 指定的是 media 檔案,也就是使用者所上傳的檔案
  • STATICFILES_STORAGE 指定的是靜態檔案,這部份主要是搭配 CDN 使用,也就是 collectstatic 以後的檔案。
  • AWS_ 開頭的變數都是 AWS 所需要的設定,AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY 是在建立 IAM 時取得的,如果你有為 EC2 實體指定 Instance profile (其實是 IAM role)的話,這兩個其實可以不需要,django-storages 會透過 boto3 去取得 (boto3 的說明)。
  • AWS_STORAGE_BUCKET_NAME 指定 bucket 的名稱,這個是需要先自己利用 AWS console 建立好的。

細部的設定可以參考 https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html 裡的說明。

結語

目前我只有使用過 S3Boto3Storage ,所以其他的就不多做介紹了。


上一篇
12. django-bootstrap4
下一篇
14. django-anymail
系列文
加速你的 Django 網站開發 - Django 的好用套件30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言