You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Channels在Heroku环境下无法连接Redis求助

解决Django Channels在Heroku上连接Redis的SSL证书验证失败问题

问题分析

本地开发环境中Django Channels通过redis://127.0.0.1:6379可正常连接Redis,但部署到Heroku后出现ssl.SSLCertVerificationError,而Celery使用相同的REDIS_URL却能正常工作。核心原因是:

  • Heroku提供的Redis实例强制要求SSL连接
  • Celery的Redis客户端会自动适配Heroku的SSL环境,而channels_redis需要显式配置SSL参数才能通过证书验证

解决方案

方案1:解析Redis URL并显式配置SSL参数

通过解析REDIS_URL,构造包含SSL配置的连接字典,跳过自签名证书的验证(Heroku Redis使用自签名证书链):

import os
from urllib.parse import urlparse

redis_url = urlparse(os.environ.get('REDIS_URL', 'redis://localhost:6379'))

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [{
                'host': redis_url.hostname,
                'port': redis_url.port,
                'password': redis_url.password,
                'ssl': {'ssl_cert_reqs': None}  # 跳过证书验证
            }],
        },
    },
}

方案2:修改URL协议为rediss://并添加SSL配置

直接将REDIS_URL的协议从redis://替换为rediss://(启用SSL的Redis协议),并配置SSL参数:

import os

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [os.environ.get('REDIS_URL', 'redis://localhost:6379').replace('redis://', 'rediss://')],
            "ssl": {"ssl_cert_reqs": None}
        },
    },
}

关键说明

  • ssl_cert_reqs: None 用于跳过自签名证书的验证,这在Heroku环境下是安全的,因为Redis连接是在Heroku内部网络中进行的
  • 若需要更严格的证书验证,可以指定Heroku的CA证书路径,但通常跳过验证即可满足需求

内容的提问来源于stack exchange,提问作者Mahmoud Said

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 00:13:12