#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")
.