Я не понимаю как настроить celery и rabbitmq на Windows
Сейчас покажу код, делаю на ubuntu все то же самое, что и на Windows Windows код не исполняет, не отправляет email, с ubuntu этот же проект работает прекрасно.Как заставить работать celery на windows? settings.py
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = '*********@gmail.com'
EMAIL_HOST_PASSWORD = '*******'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
CELERY_BROKER_URL = 'amqp://localhost'
tasks.py
from celery import task
from django.core.mail import send_mail
from .models import Order
@task
def order_created(order_id):
'''Задача отправки email-уведомлений при успешном оформлении заказа'''
order = Order.objects.get(id = order_id)
subject = 'Order nr. {}'.format(order.id)
message = 'Dear {},\n\nYou have successfully placed an order.\
You order id is {}'.format(order.first_name,order.id)
mail_sent = send_mail(subject,message,'[email protected]',[order.email], fail_silently=False)
return mail_sent
@task
def debug_task():
print('Request :{0!r}'.format(1))
celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myshop.settings')
app = Celery('myshop')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
views.py
def order_create(request):
cart = Cart(request)
if request.method == 'POST':
form = OrderCreateForm(request.POST)
if form.is_valid():
order = form.save()
for item in cart:
OrderItem.objects.create(order = order,
product = item['product'],
price = item['price'],
quantity = item['quantity'])
cart.clear()
#Запуск ассинхронной задачи celery -A myshop worker -l info
order_created.delay(order.id)
#debug_task.delay()
return render(request,'orders/order/created.html',{'order':order})
else:
form = OrderCreateForm()
return render(request,'orders/order/create.html',{'cart':cart,'form':form})
Вот сижу уже второй день и не могу разобраться, почему на Linux все гладко, а windows козни строит и не шлет мне e-mail. Он обиделся на меня или что я должен сделать, чтобы windows нормально сработал с celery и rabbitmq. Следует отметить, что celery на Windows видит задачу, создает поток, но не возвращает success, просто вечно висисит в состоянии Recieved tasks. В общем,для краткости поясню вопрос: Почему celery на windows не выполняет задачу, что я делаю не так, как исправить?
Ответы (1 шт):
Как говорят, вечеринка уже кончилась, но может кому еще будет полезно.
Формат корректной команды запуска воркера в среде Windows следующий:
celery -A proj worker -l info --pool=solo
Т.е. + "--pool=solo".
Причину не знаю, увидел эту инфу в англоязычном туториале. Прямым текстом говорится, что если этого не сделать, задачи будут висеть в стадии инициализации.
И да, можно (и, наверное, нужно) создать для RabbitMQ юзера, дать ему права и создать хост. А также не забыть в случае Windows предварительно установить Erlang.
Но это не изменит того факта, что без "--pool=solo" работать не будет.
Изучение вопроса было увлекательным. Особенно с учетом вот этого. Это придало вопросу пикантности с самого старта.
P.S. Настройки брокера прописываются в Django settings.py:
CELERY_BROKER_URL = 'amqp://myuser:mypassword@localhost:5672/myvhost'
или же в celery.py:
app = Celery('myshop', broker='amqp://myuser:mypassword@localhost:5672/myvhost')