Django中含特殊字符的Redis密码无法使用问题求助
Redis密码含特殊字符导致LOCATION配置报错的解决办法
问题描述
我有一台Redis服务器,其认证密码包含=和?字符。采用redis://[:password]@localhost:6397格式的LOCATION配置,具体配置如下:
'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://:6?V4=434#ef4@localhost:6379/1', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', } },
但始终报错TypeError: __init__() got an unexpected keyword argument 'V4',原因是LOCATION格式会将密码中的=和?识别为URL分隔符。尝试转义特殊字符为6\?V4\=434#ef4后,又出现ValueError: Port could not be cast to integer value as '6\\'错误。请问能否不将密码移至OPTIONS中解决该问题?
解决方案
可以通过URL编码密码中的特殊字符解决,无需将密码移至OPTIONS中。
- 对密码里的特殊字符单独做URL编码:
?对应编码为%3F=对应编码为%3D
- 将编码后的密码替换到LOCATION字段中,修改后的配置如下:
'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://:6%3FV4%3D434#ef4@localhost:6379/1', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', } },
URL编码会把特殊字符转换为URL安全的格式,既不会被解析成URL分隔符,也不会触发端口解析错误,完美适配LOCATION的URL格式要求。
内容的提问来源于stack exchange,提问作者Badr
相关产品推荐
相关产品推荐

