Home > OS >  How do I successfully connect Django to Azure Cache for Redis?
How do I successfully connect Django to Azure Cache for Redis?

Time:09-16

I have a django application that I have just migrated to MS Azure from Digital Ocean, and the app runs perfectly on Azure. However, I'm struggling to implement a cache backend with an Azure Cache for Redis service.

I have the following configuration in 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",
            },
        }
    }  

I have replaced my redis service name with <my_redis_service_name>.

With this setup and DEBUG=True, I receive the error:

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

Strange since redis:// is in the url. I have verified the keys, and ensured the redis service firewall accepts my VM's IP4 address, as well as making sure port 6380 is open on the VM. I have also tried various permutations of the connection string, such as:

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

No luck. If it's relevant, I'm using Django 4.0.7, Python 3.8, django-cachalot, and jazzband's django-redis package. Azure Cache for Redis states that it's using Redis version 6.0.14. For what it's worth, my development environment works fine with a local daemonized redis cache at "LOCATION": "redis://127.0.0.1:6379/1",. Any help appreciated.

CodePudding user response:

Since SSL is mandatory on AZURE REDIS you need to do something like this:

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: As mentioned in django_redis Readme we use rediss:// if we want a SSL connection

CodePudding user response:

After trying many, many permutations of the connection string and options, I finally hit on a version that worked:

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

Note the rediss:// schema with the extra 's' for SSL, which is analogous to HTTPS, and the : before {secrets.AZURE_REDIS_PASSWORD}, which would normally follow a username (there is no username on Azure redis). Hopefully this helps someone, because as of this writing I have not found documented examples of django redis configs using Azure redis. Also added /0 after the port to denote the default redis database.

  • Related