【问题标题】:OperationalError, Error 111 connecting to 127.0.0.1:6379. Connection refused. After deploying in herokuOperationalError,连接到 127.0.0.1:6379 的错误 111。拒绝连接。在heroku中部署后
【发布时间】:2022-01-15 21:03:08
【问题描述】:

在 heroku 上部署我的网站后,我收到以下错误。

Error 111 connecting to 127.0.0.1:6379. Connection refused.
Request Method: POST
Request URL:    https://website.herokuapp.com/account/register
Django Version: 3.2.8
Exception Type: OperationalError
Exception Value:    
Error 111 connecting to 127.0.0.1:6379. Connection refused.
Exception Location: /app/.heroku/python/lib/python3.8/site-packages/kombu/connection.py, line 451, in _reraise_as_library_errors
Python Executable:  /app/.heroku/python/bin/python
Python Version: 3.8.12
Python Path:    
['/app',
 '/app/.heroku/python/bin',
 '/app',
 '/app/.heroku/python/lib/python38.zip',
 '/app/.heroku/python/lib/python3.8',
 '/app/.heroku/python/lib/python3.8/lib-dynload',
 '/app/.heroku/python/lib/python3.8/site-packages']
Server time:    Sat, 11 Dec 2021 21:17:12 +0530

所以基本上我的网站必须在注册后发送有关 otp 的电子邮件以及一些与合同相关的电子邮件。这些电子邮件是必须发送的,因此无法避免。我之前在这里发布了一个关于如何最小化发送电子邮件所花费的时间的问题,以便用户不必一直等待。有人建议我为此使用异步代码。所以我决定用芹菜来做这个。我关注了教如何使用它的 youtube 视频。

现在在我将代码推送到网站后,我收到了这个错误。我是初学者,不知道如何纠正它。请建议我该怎么做。以下是详细信息和配置。

settings.py


CELERY_BROKER_URL = 'redis://127.0.0.1:6379'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379'
CELERY_ACCEPT_CONTENT =['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SELERLIZER = 'json'

requirements.txt

amqp==5.0.6
asgiref==3.4.1
billiard==3.6.4.0
celery==5.2.1
click==8.0.3
click-didyoumean==0.3.0
click-plugins==1.1.1
click-repl==0.2.0
colorama==0.4.4
Deprecated==1.2.13
dj-database-url==0.5.0
Django==3.2.8
django-ckeditor==6.1.0
django-filter==21.1
django-js-asset==1.2.2
django-multiselectfield==0.1.12
dnspython==2.1.0

正如我提到的,我是初学者,请建议我详细解答如何纠正此错误。

【问题讨论】:

    标签: django heroku redis django-celery django-redis


    【解决方案1】:

    问题来了:

    CELERY_BROKER_URL = 'redis://127.0.0.1:6379'
    

    Redis 不会在您的本地测功机上运行。您必须在其他地方运行它并配置您的代码以连接到它。 A common choice is to run Redis via an addon:

    一旦您选择了代理,请创建您的 Heroku 应用并将插件附加到它。在示例中,我们将使用 Heroku Redis 作为 Redis 提供者,但在 Heroku Elements Marketplace 中还有很多其他 Redis providers

    如果你选择使用 Heroku Redis,你可以get the connection string to your instance via the REDIS_URL environment variable:

    Heroku 附加组件为您的应用程序提供环境变量,这些变量可以传递给您的 Celery 应用程序。例如:

    import os
    app.conf.update(BROKER_URL=os.environ['REDIS_URL'],
                    CELERY_RESULT_BACKEND=os.environ['REDIS_URL'])
    

    您的 Celery 应用现在知道将您选择的代理和结果存储用于您在其中定义的所有任务。

    其他插件将提供类似的配置机制。

    这里所有引用的文档和大多数链接都来自 Heroku 的 Using Celery on Heroku 文章。我建议您阅读整个文档以了解更多信息。

    【讨论】:

    • 先生,我只是想澄清一下,当他们说我必须将该代码添加到 Celery 应用程序时,他们的意思是在 celery.py 还是我项目的 settings.py 中
    • 您的意思是这里最后引用的 sn-p 使用了REDIS_URL 环境变量?这取决于你在做什么。您是否正在构建自定义管理命令(您会像 python manage.py my_command 这样运行)?如果您现有的配置是在settings.py 中完成的(看起来是这样),您可能希望将新代码放在那里。但不要只是复制它。如果您的代码当前使用settings.CELERY_BROKER_URL,您可能只想执行CELERY_BROKER_URL = os.getenv("REDIS_URL", default="some_default_for_local_development") 之类的操作。