我有一个 Django 应用程序,刚刚从 Digital Ocean 迁移到 MS Azure,并且该应用程序在 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://
在网址中。我已验证密钥,并确保 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 的 django-redis 包。 Azure Redis 缓存声明它使用 Redis 版本 6.0.14。就其价值而言,我的开发环境与位于
"LOCATION": "redis://127.0.0.1:6379/1",
的本地守护进程化 Redis 缓存配合得很好。任何帮助表示赞赏。
自 AZURE REDIS 上的
SSL is mandatory
起,您需要执行以下操作:
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
}
}
}
注意:正如 django_redis 自述文件中提到的,如果我们想要 SSL 连接,我们使用
rediss://
在尝试了很多很多连接字符串和选项的排列之后,我终于找到了一个有效的版本:
"LOCATION": f"rediss://:{secrets.AZURE_REDIS_PASSWORD}@<my_redis_service_name>.redis.redis.cache.windows.net:6380/0",
请注意
rediss://
架构,其中 SSL 带有额外的“s”,类似于 HTTPS
,以及 :
之前的 {secrets.AZURE_REDIS_PASSWORD}
,通常跟在用户名后面(Azure redis 上没有用户名)。希望这对某人有帮助,因为在撰写本文时,我还没有找到使用 Azure redis 的 django redis 配置的记录示例。还在端口后添加 /0
表示默认的 redis 数据库。
以上内容适用于 Django 5。
CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.redis.RedisCache"
"LOCATION": f"rediss://:{AZURE_REDIS_CACHE_KEY}@redis-qa-ai-app.redis.cache.windows.net:6380/0"
}
}
正如上面 Milo Persic 提到的,redis 有一个额外的 s。如果您错过了这一点,对 Redis 的调用将挂起并最终超时。