[英]Function call in another file not working in Django rest framework
當管理員發布博客文章時,我使用 Django 信號觸發任務(使用 Django celery 包向訂閱者發送大量電子郵件)。 信號被觸發但任務文件中的任務函數沒有被調用。 這是因為我在任務函數中放置了一個不打印的打印函數。
我的 signlas.py 文件:
from apps.blogs.celery_files.tasks import send_mails
from apps.blogs.models import BlogPost,Subscribers
from django.db.models.signals import post_save
from django.dispatch import receiver
def email_task(sender, instance, created, **kwargs):
if created:
print("@signals.py")
send_mails.delay(5)
post_save.connect(email_task, sender=BlogPost,dispatch_uid="email_task")
我的 task.py 文件
from __future__ import absolute_import, unicode_literals
from celery import shared_task
# from celery.decorators import task
from apps.blogs.models import BlogPost,Subscribers
from django.core.mail import send_mail
from travel_crm.settings import EMAIL_HOST_USER
from time import sleep
@shared_task
def send_mails(duration,*args, **kwargs):
print("@send_mails.py")
subscribers = Subscribers.objects.all()
blog = BlogPost.objects.latest('date_created')
for abc in subscribers:
sleep(duration)
print("i am inside loop")
emailad = abc.email
send_mail('New Blog Post ', f" Checkout our new blog with title {blog.title} ",
EMAIL_HOST_USER, [emailad],
fail_silently=False)
這里。 不執行 print("@send_mails.py") 但執行了signals.py文件中的 print("@signals.py") 。 因此,在創建 Blogpost 模型對象后接收信號,但不會執行 task.py 中的 send_mails 函數。
我已經安裝了 celery 和 redis 服務器,並且都運行良好。
最重要的是,如果我從信號文件中刪除 .delay(5) 而只是在 email_task 中使用 send_mails() ,它可以完美運行並且我正在收到電子郵件。 但是一旦我添加了 delay() 函數,任務文件中的功能就不會被調用。 什么問題??
我運行工人信息時的回溯:
-------------- celery@DESKTOP-AQPSFR9 v5.1.2 (sun-harmonics)
--- ***** -----
-- ******* ---- Windows-10-10.0.18362-SP0 2021-07-18 11:06:10
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app: travel_crm:0x15c262afcd0
- ** ---------- .> transport: redis://localhost:6379//
- ** ---------- .> results: redis://localhost:6379/
- *** --- * --- .> concurrency: 4 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery
[tasks]
. apps.blogs.celery_files.celery.debug_task
. apps.blogs.celery_files.tasks.send_mails
. travel_crm.celery.debug_task
[2021-07-18 11:06:11,465: INFO/SpawnPoolWorker-1] child process 9276 calling self.run()
[2021-07-18 11:06:11,475: INFO/SpawnPoolWorker-2] child process 8792 calling self.run()
[2021-07-18 11:06:11,496: INFO/SpawnPoolWorker-4] child process 1108 calling self.run()
[2021-07-18 11:06:11,506: INFO/SpawnPoolWorker-3] child process 7804 calling self.run()
[2021-07-18 11:06:13,145: INFO/MainProcess] Connected to redis://localhost:6379//
[2021-07-18 11:06:17,206: INFO/MainProcess] mingle: searching for neighbors
[2021-07-18 11:06:24,287: INFO/MainProcess] mingle: all alone
[2021-07-18 11:06:32,396: WARNING/MainProcess] c:\users\user\desktop\travelcrm\myvenv\lib\site-packages\celery\fixups\django.py:203: UserWarning: Using settings.DEBUG leads to a memory
leak, never use this setting in production environments!
warnings.warn('''Using settings.DEBUG leads to a memory
[2021-07-18 11:06:32,396: INFO/MainProcess] celery@DESKTOP-AQPSFR9 ready.
[2021-07-18 11:06:32,596: INFO/MainProcess] Task apps.blogs.celery_files.tasks.send_mails[6bbac0ae-8146-4fb0-b64b-a07755123e1d] received
[2021-07-18 11:06:32,612: INFO/MainProcess] Task apps.blogs.celery_files.tasks.send_mails[25d3b32a-f223-4ae4-812b-fa1cfaedaddd] received
[2021-07-18 11:06:34,633: ERROR/MainProcess] Task handler raised error: ValueError('not enough values to unpack (expected 3, got 0)')
Traceback (most recent call last):
File "c:\users\user\desktop\travelcrm\myvenv\lib\site-packages\billiard\pool.py", line 362, in workloop
result = (True, prepare_result(fun(*args, **kwargs)))
File "c:\users\user\desktop\travelcrm\myvenv\lib\site-packages\celery\app\trace.py", line 635, in fast_trace_task
tasks, accept, hostname = _loc
ValueError: not enough values to unpack (expected 3, got 0)
[2021-07-18 11:06:34,633: ERROR/MainProcess] Task handler raised error: ValueError('not enough values to unpack (expected 3, got 0)')
Traceback (most recent call last):
File "c:\users\user\desktop\travelcrm\myvenv\lib\site-packages\billiard\pool.py", line 362, in workloop
result = (True, prepare_result(fun(*args, **kwargs)))
File "c:\users\user\desktop\travelcrm\myvenv\lib\site-packages\celery\app\trace.py", line 635, in fast_trace_task
tasks, accept, hostname = _loc
ValueError: not enough values to unpack (expected 3, got 0)
堆棧跟蹤有助於確定問題與調用 celery 函數有關。
ValueError: not enough values to unpack (expected 3, got 0)
這是代碼的這一部分:
send_mails.delay(5)
嘗試使用apply_async
調用該函數。
send_mails.apply_async(args=(5, ))
如果這不起作用,請從def send_mails(duration):
刪除*arg
和**kwargs
。 我不明白為什么需要這些參數。
更多信息可以在這個答案中找到: https : //stackoverflow.com/a/48910727/7838574
或在此處的文檔中: https : //docs.celeryproject.org/en/latest/userguide/calling.html#basics
嘗試從 celery 任務中刪除duration, args and kwargs
。
@shared_task
def send_mails():
subscribers = Subscribers.objects.all()
blog = BlogPost.objects.latest('date_created')
emails = [abc.email for abc in subscribers]
send_mail('New Blog Post ', f" Checkout our new blog with title {blog.title} ", EMAIL_HOST_USER, emails, fail_silently=False)
現在在信號
def email_task(sender, instance, created, **kwargs):
if created:
print("@signals.py")
send_mails.delay()
如果您想在倒計時后執行任務,您可以在此處使用apply_async
文檔以獲取更多信息,但我認為這里沒有必要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.