Как успешно подключить 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 по умолчанию.