Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当调用异步任务芹菜引发异常时:";NameError:未定义全局名称*“;_Python_Django_Django Models_Celery - Fatal编程技术网

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