Redis.from_url()连接redis时,redis密码带有#号报错
#在 URL 中是片段标识符Fragment Identifier的开始标志如果不处理#后面的内容会被浏览器或解析器直接忽略导致密码被截断连接失败。❌ 错误示例会出问题# ❌ 这样写实际密码会变成 abc后面的内容全部丢失Redis.from_url(redis://:abc#123localhost:6379/0)实际解析结果你以为的密码abc#123实际解析到的密码abc#123被当成了 URL 的 fragment直接丢弃✅ 正确做法URL 编码Percent-Encoding#的 URL 编码是%23fromredisimportRedis# ✅ 正确写法redis_clientRedis.from_url(redis://:abc%23123localhost:6379/0) 推荐使用 urllib 自动编码最稳妥如果是从配置文件、环境变量里读密码强烈建议用代码自动编码避免手写出错。fromurllib.parseimportquote_plusfromredisimportRedis passwordabc#123encoded_passwordquote_plus(password)urlfredis://:{encoded_password}localhost:6379/0redis_clientRedis.from_url(url)redis_client.ping()print(✅ 连接成功) 常见需要编码的特殊字符速查表字符含义URL 编码#片段标识%23分隔符%40:分隔符%3A/路径分隔%2F%本身%25空格%2B空格空格%20只要密码里有非字母数字字符都建议直接quote_plus()✅ 更推荐的写法避免 URL 拼接问题如果你不想折腾 URL 编码直接用参数方式内部会自动处理fromredisimportRedis redis_clientRedis(hostlocalhost,port6379,db0,passwordabc#123,# ✅ 原样写最安全decode_responsesTrue)生产环境强烈推荐这种方式可读性最好坑最少。 Docker / Kubernetes / 云环境注意事项如果是从环境变量读取importosfromurllib.parseimportquote_plusfromredisimportRedis raw_passwordos.getenv(REDIS_PASSWORD)# abc#123redis_clientRedis.from_url(fredis://:{quote_plus(raw_password)}redis:6379/0)✅ 总结一句话Redis 密码里有#必须 URL 编码成%23否则密码会被截断。最佳实践不用from_url()拼密码改用Redis(passwordxxx)参数方式。