Breaking News

Default Placeholder Default Placeholder

djangoでceleryを使って非同期処理を組み込みたいのですが、その前に、celeryはredisを必要とするということでまずはdjango + redisの環境を整えたいと思います。

docker-compose

以前docker-composeで作った環境にredisを追加したいと思います。

version: '3.7'
services:
  django:
    restart: always
    build: .
    volumes:
      - ./:/projects
    command: /bin/sh -c "cd /projects; python manage.py migrate; python manage.py runserver 0:8000"
    ports:
      - 8000:8000
    depends_on:
      - db (ここをsettings.pyのhost名と同じにしないと接続できない)
      - redis (←追加)
  db: (ここをsettings.pyのhost名と同じにしないと接続できない)
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: データベース名
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: パスワード
    tty: true
    ports:
      - 3306:3306
    command: mysqld --character-set-server=utf8mb4 --explicit_defaults_for_timestamp=true
  redis: (←ここから追加)
    image: redis:latest
    ports:
      - 6379:6379
    tty: true

redisのイメージを使い、djangoのコンテナと連携させます。

requirements.txt

requirements.txtに

django-redis

を追加します。

django-redis

django-redisとはその名の通り、djangoでredisを使うためのモジュールです。

ドキュメント

http://niwinz.github.io/django-redis/latest/

settings.py

django-redisでキャッシュを使いますという設定を追加します。

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://redis:6379/',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient'
        }
    }
  }

LOCATION のポート番号の前の redisに注目してください。ここは先ほど docker-composeで書いた `redis`コンテナの名前をリンクしていますので注意が必要です。

使い方

実際の使い方をご紹介しましょう。

ここでは簡単ではありますが、今の日時を保存してみたいと思います。

セット

# python manage.py shell
Python 3.7.4 (default, Jul 13 2019, 14:35:55)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
# 日時を取得
import datetime
now = datetime.datetime.now()
print(now.strftime('%Y-%m-%d %H:%M:%S'))
'2019-09-21 01:53:27'
# ここからdjango-redisが出てくる
from django_redis import get_redis_connection
redis = get_redis_connection("default")
result = redis.set("time", now.strftime('%Y-%m-%d %H:%M:%S'))
print(result)
True

さて、 `time`というキーに今の日時をセットしてみました。ちゃんと入っているか、取り出して確認してみましょう。

ゲット

redis.get('time')
b'2019-09-21 01:53:27'

ちゃんとセットされている事が確認できました。

以上、djangoでのredisの使い方でした。

最後までお読みいただきありがとうございました。