Python 当调用异步任务芹菜引发异常时:";NameError:未定义全局名称*“;
执行异步任务时,芹菜引发异常Python 当调用异步任务芹菜引发异常时:";NameError:未定义全局名称*“;,python,django,django-models,celery,Python,Django,Django Models,Celery,执行异步任务时,芹菜引发异常 #case where error is thrown send_registration_email.delay("test", "test@gmail.com", {}) 当我通过省略芹菜来执行代码时,不会出现此错误 #case where code is executed correctly send_registration_email("test", "test@gmail.com&q
#case where error is thrown
send_registration_email.delay("test", "test@gmail.com", {})
当我通过省略芹菜来执行代码时,不会出现此错误
#case where code is executed correctly
send_registration_email("test", "test@gmail.com", {})
我如何用芹菜执行异步任务,这样我就可以避免这个错误了
错误
芹菜任务
邮件类
#mailer.py
从未来导入绝对导入
从django.core.mail.message导入EmailMultiAlternations
从django.template.loader导入get_模板
类Mailer():
@静力学方法
def发送电子邮件(电子邮件类型=”,收件人=”,数据={}):
尝试:
email=Mailer.创建电子邮件(电子邮件类型、收件人、数据)
email.send()
返回真值
例外情况除外,如e:
返回错误
@类方法
def创建电子邮件(自我、电子邮件类型、收件人、数据):
subject=“”
message=“”
发件人\电子邮件=”mailgun@xxx.mailgun.org"
如果电子邮件类型==“测试”:
subject=“测试对象”
content\u html=“测试”
email=EmailMultiAlternations(主题、无、发件人\电子邮件、[收件人])
电子邮件。附加可选内容(内容为html,“文本/html”)
返回电子邮件
正如@grrrr建议重启芹菜工人解决了问题。在我的情况下,芹菜工人是由主管管理的,所以我必须重新启动主管 您需要重新启动worker,以便查看worker实例中反映的文件更改。芹菜不监视文件更改,因此如果在工作程序运行时更改任何文件,则需要重新启动工作程序
出于开发目的,可通过使用以下功能避开此问题:
启用自动重新加载后,辅助线程将启动一个附加线程,以监视文件系统中的更改。导入新模块,并在检测到更改时重新加载已导入的模块,如果使用了预工作池,则子进程将完成正在执行的工作并退出,以便可以用有效地重新加载代码的新进程替换它们
这是一个实验性功能,应该只在开发环境中使用自从您从utilities.helpers.mailer import mailer添加了
,您是否重新启动了worker?我想知道您为什么将这些作为类的一部分?实际上不需要那个Mailer类,因为它只包含两个静态/类方法。使它们成为独立的模块级函数。Hi@grrrr。你说得很对,显然工人解决了这个问题。“我必须重新启动负责芹菜工人的主管。@Daniel Roseman我使用邮件类作为邮件的聚合和包装。它允许我将所有与电子邮件相关的东西(临时邮件、主题…)保存在一个地方。我相信这就是所谓的“关注点分离”,但这就是mailer.py。为什么需要在其中使用第二个名称空间?
[2015-10-12 14:50:57,176: ERROR/MainProcess] Task tasks.core.email.send_registration_email[5f96bee3-9df7-42ce-b726-c7086e82b954] raised unexpected: NameError("global name 'Mailer' is not defined",)
Traceback (most recent call last):
File "/usr/local/lib/python2.7/site-packages/celery/app/trace.py", line 240, in trace_task
R = retval = fun(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/celery/app/trace.py", line 438, in __protected_call__
return self.run(*args, **kwargs)
File "/srv/www/compare/htdocs/tasks/core/email.py", line 6, in send_registration_email
@shared_task
NameError: global name 'Mailer' is not defined
# email.py
from __future__ import absolute_import
from celery import shared_task
from utilities.helpers.mailer import Mailer
@shared_task
def send_registration_email(email_type="", recipient="", data={}):
Mailer.send_email(email_type, recipient, data)
# mailer.py
from __future__ import absolute_import
from django.core.mail.message import EmailMultiAlternatives
from django.template.loader import get_template
class Mailer():
@staticmethod
def send_email(email_type="", recipient="", data={}):
try:
email = Mailer.create_email(email_type, recipient, data)
email.send()
return True
except Exception as e:
return False
@classmethod
def create_email(self, email_type, recipient, data):
subject = ""
message = ""
sender_email = "mailgun@xxx.mailgun.org"
if email_type == "test":
subject = "Test subject"
content_html = "<html><body><h1>Test</h1></body></html>"
email = EmailMultiAlternatives(subject, None, sender_email, [recipient])
email.attach_alternative(content_html, "text/html")
return email