OperationalError, ошибка 111 при подключении к 127.0.0.1: 6379. Отказано в подключении. После развертывания в heroku

#django #heroku #redis #django-celery #django-redis

#django #heroku #redis #джанго-сельдерей #django-redis

Вопрос:

Я получаю следующую ошибку после развертывания своего веб-сайта на 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
 

Как я уже упоминал, я новичок, пожалуйста, предложите мне подробный ответ о том, как я могу исправить эту ошибку.

Ответ №1:

Вот проблема:

 CELERY_BROKER_URL = 'redis://127.0.0.1:6379'
 

Redis не будет работать на вашем локальном компьютере. Вам придется запустить его где-нибудь в другом месте и настроить свой код для подключения к нему. Обычным выбором является запуск Redis через аддон:

После выбора брокера создайте свое приложение Heroku и прикрепите к нему дополнение. В примерах мы будем использовать Heroku Redis в качестве поставщика Redis, но на рынке Heroku Elements Marketplace есть множество других поставщиков Redis.

Если вы решите использовать Heroku Redis, вы сможете получить строку подключения к вашему экземпляру через переменную REDIS_URL среды:

Дополнения Heroku предоставляют вашему приложению переменные среды, которые могут быть переданы в ваше приложение Celery. Например:

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

Ваше приложение Celery теперь знает, как использовать выбранного вами брокера и хранилище результатов для всех задач, которые вы в нем определяете.

Другие дополнения будут предоставлять аналогичные механизмы настройки.

Вся приведенная здесь документация и большинство ссылок взяты из статьи Heroku «Использование сельдерея в Heroku«. Я предлагаю вам прочитать весь документ для получения дополнительной информации.

Комментарии:

1. Сэр, я прошу просто разъяснить, когда они говорят, что я должен добавить этот код в приложение Celery, имеют ли они в виду celery.py или в settings.py моего проекта

2. Вы имеете в виду фрагмент в последней цитате, который использует переменную 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") .