Как успешно подключить Django к Azure Cache for Redis?

У меня есть приложение django, которое я только что перенес на MS Azure из Digital Ocean, и приложение отлично работает на Azure. Однако у меня возникают трудности с реализацией бэкенда кэша с помощью службы Azure Cache for Redis.

У меня следующая конфигурация в settings.py:

    CACHES = {
        "default": {  
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": f"redis://<my_redis_service_name>.redis.cache.windows.net:6380,password={secrets.AZURE_REDIS_PASSWORD},ssl=True,abortConnect=False",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                "COMPRESSOR": "django_redis.compressors.zlib.ZlibCompressor",
            },
        }
    }  

Я заменил имя службы redis на <my_redis_service_name>.

При такой настройке и DEBUG=True, я получаю ошибку:

ValueError at /accounts/login/
Redis URL must specify one of the following schemes (redis://, rediss://, unix://)

Странно, поскольку redis:// находится в url. Я проверил ключи и убедился, что брандмауэр службы redis принимает IP4-адрес моей ВМ, а также убедился, что порт 6380 открыт на ВМ. Я также пробовал различные варианты строки подключения, такие как:

"LOCATION": f'redis://:{secrets.AZURE_REDIS_PASSWORD}@<my_redis_service_name>.redis.cache.windows.net:6380,ssl=True,abortConnect=False',

Не повезло. Если это имеет значение, я использую Django 4.0.7, Python 3.8, django-cachalot и jazzband's django-redis pacakge. Azure Cache for Redis утверждает, что использует Redis версии 6.0.14. Если на то пошло, моя среда разработки прекрасно работает с локальным демонизированным кэшем Redis по адресу "LOCATION": "redis://127.0.0.1:6379/1",. Любая помощь будет оценена по достоинству.

После SSL is mandatory на AZURE REDIS вам нужно сделать примерно следующее:

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        "LOCATION": 'rediss://YOUR_REDIS_HOST_NAME:YOUR_REDIS_PORT',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            'PASSWORD': 'YOUR_REDIS_PASSWORD',
            'SSL': True
        }
    }
}

NOTE: Как указано в django_redis Readme, мы используем rediss://, если хотим SSL соединение

После многих, многих перестановок строки подключения и опций, я наконец нашел версию, которая работает:

"LOCATION": f"rediss://:{secrets.AZURE_REDIS_PASSWORD}@<my_redis_service_name>.redis.redis.cache.windows.net:6380/0",

Обратите внимание на схему rediss:// с дополнительным 's' для SSL, что аналогично HTTPS, и : перед {secrets.AZURE_REDIS_PASSWORD}, который обычно следует за именем пользователя (в Azure redis нет имени пользователя). Надеюсь, это кому-нибудь поможет, потому что на момент написания этой статьи я не нашел документированных примеров конфигураций django redis с использованием Azure redis. Также добавил /0 после порта, чтобы обозначить базу данных redis по умолчанию.

Вернуться на верх