如何调整Redis配置以适配Heroku-Redis?含Django-Channels配置疑问
适配Heroku Redis的Django Channels配置调整方法
嘿,我来帮你搞定Heroku Redis和Django Channels的配置适配问题~
Heroku上的Redis服务不会单独提供host、port这类零散的环境变量,而是直接通过REDIS_URL这个环境变量给出完整的连接地址,里面包含了主机、端口、认证密码(如果启用的话)等所有必要信息。所以我们需要调整原有配置,改成解析这个URL来构建Channel Layer的连接参数。
修改后的配置代码
直接替换你原来的Redis配置部分即可,代码如下:
import os from urllib.parse import urlparse # 要是用Python2,换成 from urlparse import urlparse # 优先读取Heroku提供的REDIS_URL,本地开发时自动 fallback到本地Redis redis_url = os.environ.get('REDIS_URL', 'redis://localhost:6379') parsed_redis_url = urlparse(redis_url) CHANNEL_LAYERS = { "default": { "BACKEND": "channels_redis.core.RedisChannelLayer", "CONFIG": { "hosts": [ ( parsed_redis_url.hostname, parsed_redis_url.port, { "password": parsed_redis_url.password, # 部分Heroku Redis实例会带用户名,按需处理即可 "username": parsed_redis_url.username if parsed_redis_url.username else None, } ) ], }, }, }
关键细节说明
- 用
urlparse拆分REDIS_URL,自动提取所有连接所需信息,不用手动拼接参数 - 本地开发时如果没有
REDIS_URL环境变量,会自动回退到本地Redis地址,完全不影响本地调试 - 记得先在Heroku应用上添加Heroku Redis插件(比如
heroku-redis),这样Heroku才会自动为你的应用设置REDIS_URL环境变量
这样调整后,你的Django Channels就能完美适配Heroku上的Redis服务啦~
内容的提问来源于stack exchange,提问作者Jay Jung




