提到上傳檔案,就會牽涉到檔案系統。在單一機器的情況時,這沒什麼問題,檔案就是儲存在本機。但是,如果考慮到以橫向擴充的方式 (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 實作了以下檔案系統層:
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'
細部的設定可以參考 https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html 裡的說明。
目前我只有使用過 S3Boto3Storage ,所以其他的就不多做介紹了。