utamaro’s blog

誰かの役に立つ情報を発信するブログ

Django+herokuでS3を使わない画像の保存方法

cloudinaryというアドオンを使って、画像を保存します。

画像の保存というとamazon s3が思い浮かぶと思いますが、あれほんの少しお金かかりますよね?

スタートということで、完全無料でやるためにcloudinaryを使ってみます。

cloudinaryのアドオンは↓です。

https://elements.heroku.com/addons/cloudinary

無料の範囲は↓です。

Storage: 10 GB
Monthly Bandwidth: 20 GB
Total Images & Videos: 300,000
Monthly Transformations: 20,000

準備

ライブラリをインストールする

pip install cloudinary

herokuでアドオンを追加して、画面の流れに沿って操作してください。

画像をアップロードする

import cloudinary
import cloudinary.uploader
import cloudinary.api

cloudinary.config(
  cloud_name="xxxxx",
  api_key="xxxxxxxxxx",
  api_secret="xxxxxxxxxxxxxxxx"
)

def upload(image):
    result = cloudinary.uploader.upload(image)

if __name__ == '__main__':
    upload('sample.jpg')

ちなみに、urlを指定しても保存してくれます。

upload('http://sample.com/sample.jpg)

Djangoのtemplateで画像を表示する

settingsにcloudinaryを追加する

INSTALLED_APPS = [
    ...
    'cloudinary',
    ...
]

tempalteで以下のようにする

<!DOCTYPE html>
<html>
<head>
    {% load cloudinary %}
</head>
    <body>
        {% cloudinary "public_id" crop="fill" %}
    </body>
</html>

もちろん、view内でpublic_id部分を置換しても良いです。

置換する場合は↓のようにします。

{% cloudinary public_id crop="fill" %}
context = {
    'public_id': 'xxxxxxxxxxxxxxx',
}
return self.render_to_response(context)

public_idを自分で設定する場合

アップロードする際にpublic_idを指定します。

result = cloudinary.uploader.upload(image, public_id='kyaro_kyawawa')

画像のアップロードは↓にもっと詳しいドキュメントが書かれています。

参考にすると役に立つはずです。

https://cloudinary.com/documentation/django_image_upload