Help us understand the problem. What is going on with this article?

[Django] ファイルアップロード機能の使い方 [クラウドストレージ編]

More than 1 year has passed since last update.

この記事について

前回「基本設定編」に続き Django のファイルアップロード機能(FileField、ImageField)の使い方の解説です。今回は django-storages の使い方を Amazon S3 を例に説明します。

参考

django-storages について

django-storagesはクラウドストレージをメディアファイルの保存先に使うためのパッケージです。

django-storages 公式:github/gitdocs

対応するストレージサービス等は以下の通りです

  • Amazon S3
  • Azure Storage
  • DropBox
  • Google Cloud Storage
  • Apache Libcloud
  • FTP/SFTP

Amazon S3 での動作

django-storagesを利用するとメディアファイルのURLと保存先は以下の様になります。URLはAmazon S3より直接参照するものになります。

ファイルの保存先の基点 ファイルのURLの基点
非利用時 MEDIA_ROOT MEDIA_URL
利用時 Amazon S3 バケット Amazon S3 バケットのURL

※django-storages利用時、MEDIA_ROOTとMEDIA_URLの設定は動作に影響を与えません。

セキュリティ対応

デフォルトの動作では、メディアファイルのURLはAmazon S3 の「署名付きURL発行機能(Pre-Signed URL)」を使って有効期限を付けたものになります。一定時間後(※)にアクセス不能になるURLなので、URL流出の心配はありません。

参考:S3にて Pre-Signed URLを発行する

逆にURLをパーマリンクとして使いたい場合は、バケットをパブリックアクセス可能にしたうえで設定「AWS_S3_CUSTOM_DOMAIN」にバケットのURL(もしくはRoute53で取得した独自ドメイン)を指定してください。署名付きURLではなくパーマリンクになります。

※有効期限はデフォルトで1時間(3600)。AWS_QUERYSTRING_EXPIREで変更可能。

設定手順

1.Amazon上の設定

クラウド上で以下の設定を終えてください。

  • Amazon S3にバケットを作成する。
  • Amazon IAMでユーザーを作成する。
  • Amazon IAMでグループを作成し「AmazonS3FullAccess」またはカスタムポリシーを作ってグループに割り当てる。
  • 作成したユーザーをグループに所属させる。

英語ですがこちらのサイトに詳しい作業手順があります。

Djangoの接続設定として以下の情報を使います。

  • ユーザーのアクセスキー
  • ユーザーのシークレットキー
  • バケット名

2.django-storagesのインストール

プロジェクトに「django-storages」と「boto3(Python用 Amazon SDK)」をインストールします。

コマンド
pip install django-storages
pip install boto3

3.django-storagesの設定

設定ファイルにdjango-storagesを利用するための設定と1で控えておいたアクセスキー等を設定します。

settings.py
INSTALLED_APPS = (
    ...
    'storages',
    ...
)

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

AWS_ACCESS_KEY_ID = 'Your Access Key ID'
AWS_SECRET_ACCESS_KEY = 'Your Secret Key'
AWS_STORAGE_BUCKET_NAME = 'bucket name'

これで設定完了です。

ファイルアップロードを試すと、ファイルがAmazon S3上に保存されることが確認できると思います。django-storagesではさらにキャッシュやファイル圧縮、同名ファイルアップロード時の動作の設定が可能です。詳しくは公式ドキュメントを参考にしてください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした