こんにちは、「Yukiです。

Djangoでウェブアプリケーションを作った時に画像のアップロード先はどうしようみたいな悩みは良くありますよね。
今回は画像が保管できるcloudinaryとゆうサービスを使って、Djangoの画像アップロード先を設定してみました。 ※今回は既にCloudinaryアカウントを作成している前提でお話いたします。 Cloudinaryのアカウント作成はここ(Cloudinary公式)から作成できます。



Cloudinaryについて

本題に入る前にCloudinaryとは何かについて簡単に説明しておきます。
Cloudinaryとはクラウド上に画像を保管できるストレージを提供してくれるサービスです。
今回のCloudinaryの使用目的が主に画像の保管なので、上記のように言いましたがストレージ機能だけでなく、コンテンツの高速化のためにリサイズや圧縮などが簡単にできたり、性的コンテンツの非表示みたいな機能も備わっているようです。

料金は30万ファイル、10GBまで無料です。個人的なブログなどで使用するには充分だと思います。

DjangoにCloudinaryを導入する

必要なモジュールのインストール

まず、Cloudinaryのモジュールをインストールしてください。

$ pip install django-cloudinary-storage

もしmodels.pyでImageFieldを使う場合は合わせてpillowもインストールしてください。

$ pip install Pillow

requirements.txtに追加します。

$ pip freeze > requirements.txt

settings.pyの設定

INSTALLED_APPSに以下の記述を追加してください。

INSTALLED_APPS = [
    ...
    'cloudinary_storage',
    'cloudinary',
    ...
]
※media以外でjsやcssファイルもcloudinaryで運用する場合はデフォルトで書かれているdjango.contrib.staticfilesの上にcloudinary_storageを記述してください。
次に自分のCloudinaryアカウントのcloud name, API key, API secret keyを記述します。
上記の情報はCloudinaryにログインした後、ダッシュボード上部に記載されています。

CLOUDINARY_STORAGE = {
    'CLOUD_NAME': 'your_cloud_name',
    'API_KEY': 'your_api_key',
    'API_SECRET': 'your_api_secret'
}


次に画像のURL(自分の好きなディレクトリでOK)&画像のストレージを記述します。

MEDIA_URL = '/media/'
DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'

これでsettings.pyの設定は完了です。

models.pyの設定

先ほどのsettings.pyの設定でImageFieldのアップロード先はCloudinaryになるため、models.pyで絶対に必要な設定はありません。 もし画像のアップ先を指定する場合はupload_toを記述します。

class ExampleModel(models.Model):
    image = models.ImageField(upload_to='images/', blank=True)

templateで表示する方法

templateも特別に設定することはありません。 Cloudinaryの導入前と同じように記述するとURL(https://res.cloudinary.com/〜)が表示されます。

<img src="{{ example.image.url }}" >

もしサイズ変更したい場合は以下のタグを読んで横幅と縦幅を指定してください。
{% load cloudinary %}
{% cloudinary example.image.name width=100 height=100 %}

これでDjangoアプリケーションにCloudinaryの導入が完了です。

参考にしたサイト

GitHub - klis87/django-cloudinary-storage: Django package that provides Cloudinary storages for both media and static files as well as management commands for removing unnecessary files.




まとめ

これといったエラーもなく簡単にDjangoにCloudinaryを導入することができました。 今回は画像の保管として使用しましたが、サイトの高速化の際にもぜひ使ってみたいです。 また余談ですが、写真で一言ボケて (bokete)も性的コンテンツを排除するためにCloudinaryを導入しているそうです。それまではユーザーの投稿画像は全て目視で判断していたそうです。 使い道が色々ありそうで、面白いですね!
こんな感じで今日は終わりたいと思います。 ここまで読んでくれてありがとうございました。

またね✋