【Python/Django】Herokuにデプロイしたアプリに、画像と動画をアップロード、表示するために、Cloudinaryを使った【初心者】
Djangoで作成したアプリを公開する為にHerokuにアップした際に、画像、動画のアップロードができないことを知った。調べたところCloudinaryを使うと解決できるらしい。想定していた機能までは実装できたのと、日本語の記事も少なく、いくつか嵌ったところもあったので、残しておく。
【参考にさせていただいた記事】
① 【記録用】cloudinaryを使ってherokuでDjangoアプリの画像投稿を可能にする
② herokuで、cloudinaryを利用した画像アップロード(python+django)
③ Cloudinaryを使って画像の変換をやってみる
▼Cloudinaryとは
画像を管理するクラウドサービスで、画像の保存、変換、配信が簡単に実装できる。無料でも利用可能(StarterPlan)でも、30万ファイル、10ギガのストレージが利用可能。Djangoだけでなく、様々なSDKが用意されており、個人利用やプロトタイプ程度であれば、十分使えるのではないか。こちらからサインアップ頂くと、少しボーナスもらえるようなので、これから登録される方は是非利用いただきたい。
今回は、CloudinaryとDjangoを利用して、
①画像、動画のアップロード
②アップロードした画像、動画の閲覧
を行うために実施したことを記載していく。
▼Herokuとの連携
HerokuのOverviewから、add-onでCloudinaryを追加する。各設定を行い、ダッシュボードが見られるようになる。
Cloudinaryのインストール
開発している仮想環境で、コンソールからインストールを行う。
$ pip install django-cloudinary-storage
$ pip install Pillow
$ pip freeze > requirements.txt
▼Djangoへの導入方法:settings.py
settings.py へ追記
INSTALLED_APPSの最下部に追加する。
DEFAULT_FILE_STORAGEも設定しておくと、ImageFieldやFileFieldと自動的に連携してくれる模様。
# settings.py
INSTALLED_APPS = [
・・・・・・・・・・
'cloudinary', #追加
'cloudinary_storage', #追加
]
DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'
cloudinaryアカウントとの紐付けも、同様にsettings.pyに記入。
アカウント情報は、cloudinaryのダッシュボードの最上部にある。
# settings.py
CLOUDINARY_STORAGE = {
'CLOUD_NAME': 'your_cloud_name',
'API_KEY': 'your_api_key',
'API_SECRET': 'your_api_secret'
}
▼Djangoへの導入方法:models.py / forms.py
models.py の設定
ローカルなどで開発したモデルを必要に応じて修正する必要。imageFieldでも設定次第で対応してくれるようだが、後述するoptionsや画像の加工などを行いたかったので、CloudinaryFieldに修正した。
# models.py
from cloudinary.models import CloudinaryField #追加
class Model_name(models.Model):
image = CloudinaryField('image', blank=True, null=True,)
video = CloudinaryField("video", blank=True, null=True,)
forms.pyの設定
Fieldに関する詳細な設定はforms.pyにて行う。
# forms.py
from cloudinary.forms import CloudinaryFileField #追加
class ModelnameCreateForm(forms.ModelForm):
class Meta:
model = Model_name
fields = ('image', 'video',)
image = CloudinaryFileField(
options={'folder': 'media/Model_image', 'tags': 'Model_name'})
movie = CloudinaryFileField(
options={'folder': 'media/Model_movie', 'tags': 'Model_name',
'resource_type': 'video'})
注意:CloudinaryFileField は、class Meta: の外に設定する。
optionsの設定は任意だが、動画をアップロードするときには、
'resource_type': 'video' を設定する必要がある。
他、options の詳細については公式ドキュメントを参照のこと。
▼Djangoへの導入方法:Templates
templateでの設定は下記の通り。
# index.html 一覧を作成する画面で画像を表示する
{% load cloudinary %}
{% for post in object_list %}
{% cloudinary post.image.url width=300 height=150 %}
{% endfor %}
上記で実際に表示されるhtmlはこちら
<img height="150" src="https://res.cloudinary.com/<username>/image/upload/v12345678/xxxxxxxxxxxxx.jpg" width="300"/>
cloudoinary url を使うときには、{% load cloudinary %}を最初に設置する。
# detail.html 詳細画面で動画を表示する
<video width='640' height= '480' controls>
<source src="{{ object.video.url }}">
</video>
普通に、video.urlでも表示できた。
<実装できておらず調査中の点>
{% cloudinary "sample.jpg" width=100 height=150 crop="fill" %}
公式ドキュメントにあるような、cropの設定を上記のようなテンプレートタグにて行ったところ、実際の画面に反映されなかった。(cropを変更しても画像の表示のされ方が変わらない。)
原因、解決方法や実装できた方がいらっしゃったら、是非コメントなどで教えていただきたい。解決次第、追記、修正していく。
>>その後、開発を進める過程で解決したので、別記事にて追記していく。
スタートアップ支援と、社内スタートアップをしながら、実務未経験から独学でプログラミング勉強中。主にpython。スクレイピング、機械学習から始めて、最近はDjangoを学習し、WEBサービス作成中。独学されている初心者の方向けに、技術の記事を中心に書いていきます。