LoginSignup
11
10

More than 3 years have passed since last update.

Django + Google Cloud Strageで、ImageFieldの画像をサーバでも正常に表示させる

Last updated at Posted at 2019-11-13

HerokuやGAE(Google App Engine)などのサーバで、ImageFieldを使用しても画像が正常に表示されません。

これは、SQLが画像のアップロードに対応していないためで、これの解決にはGoogle Cloud StrageやAmazon S3などのクラウドストレージに画像をアップロードしなければなりません。

今回は、Google Cloud Storageに画像をアップロードする方法をご紹介します。

Django Strage (Google Cloud Storage) 公式ドキュメント
https://django-storages.readthedocs.io/en/latest/backends/gcloud.html

Django Strage のインストール

Django で Google Cloud Strage を扱うための Django ライブラリ、 Django Strage (Google Cloud Storage) をpipでインストールします。

bash
$ pip install django-storages[google]

Google Cloud Platform で認証情報の取得

Google Cloud Platform から、 Cloud Strageの認証情報の登録と、認証情報の記載された JSON ファイルを取得します。

サービスアカウントの取得

Googleスタートガイド (https://cloud.google.com/docs/authentication/getting-started) から取得できます。

手順1
Googleスタートガイド (https://cloud.google.com/docs/authentication/getting-started) のリンクから、「[サービスアカウントキーの作成]ページに移動」を選択
手順1

手順2
新しいサービスアカウントを作成で、サービスアカウント名を入力。
GCS2
その後、役割から「ストレージ」 -> 「ストレージ管理者」を選択。
キーのタイプがJSONになっていることを確認して、「作成」ボタンを押下してください。
GCS3
そうすると、JSONファイルがダウンロードされます。
GCS4

ダウンロードしたJSONファイルは、Djangoプロジェクトのルートディレクトリに配置してください。

Google Cloud Strageのバケットの作成

Cloud Strageの単位をバケットといいます(データを入れるバケツみたいな意味)
これを作成して、データを収納します。

Google Cloud Console (Cloud Strage)
https://console.cloud.google.com/storage/browser

上記URLからアクセスすると、以下のような作成画面に遷移すると思うので、新規バケットを作成します。
作成画面.png

完了すると以下のような画面になります。
作成完了.png

これで、Google Cloud Platform console での設定は完了です。

Djangoでの設定

settings.pyに設定の追加

settings.pyファイルでデフォルトのストレージとバケット名を設定します。

settings.py
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
DEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'

GS_BUCKET_NAME = '[YOUR_BUCKET_NAME_GOES_HERE]'

from google.oauth2 import service_account

GS_CREDENTIALS = service_account.Credentials.from_service_account_file(
    os.path.join(BASE_DIR, '[YOUR_AUTHENTICATON_KEY_FILE_NAME].json'),
)

以上で設定は完了です。

あとは以下のコマンドを実行しましょう。

bash
$ python manage.py collectstatic

そして設定の変更をサーバにデプロイすると正常に機能するはずです。

お疲れ様でした。

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10