如何使用邮戳编写Celery任务

时间:2017-09-21 16:57:53

标签: python unit-testing celery django-celery postmark

我正在尝试编写一个使用postmarker client library发送电子邮件的芹菜任务。这是一个调用postmarkapp.com API端点的简单客户端库。

# In tasks.py

@app.task(bind=True)
def send_email(...):
    """Sends a single email via Postmark."""
    postmark = PostmarkClient(...)
    response = postmark.emails.send(...)
    log.info('Postmark API send_email response %s', response)

但是当我尝试在我的测试中执行任务时:

# in test_tasks.py

class PostmarkSendEmail(TestCase):
    def test_call_send_email(self):
        send_email(...)

我收到以下错误

TypeError: <@task: tasks.send_email of groot at 0x7f2c35b9e911> is not JSON serializable

我的问题是,是否可以在芹菜任务中使用此客户端库?我可以做些什么来让我在芹菜任务中使用这个库吗?

1 个答案:

答案 0 :(得分:0)

我发现问题是bind=True参数传递到@app.task()。解决方案是删除该参数:

@app.task()
def send_email(...):
    """Sends a single email via Postmark."""
    postmark = PostmarkClient(...)
    response = postmark.emails.send(...)
    log.info('Postmark API send_email response %s', response)

或者,我可以将self参数添加到send_email方法:

@app.task(bind=True)
def send_email(self, ...):
    """Sends a single email via Postmark."""
    postmark = PostmarkClient(...)
    response = postmark.emails.send(...)
    log.info('Postmark API send_email response %s', response)

作为bind参数,将方法绑定到App实例。