将Web请求上下文透明地传递给Celery任务

6

我有一个多租户设置,我想传递一些特定于客户的信息,特别是request.host到celery任务中,理想情况下它应该在全局变量中可用。有没有一种方式可以设置这个,在对应用程序透明的方式下?

任务将以相同的方式被调用:

my_background_func.delay(foo, bar)

任务的定义方式相同,只是它可以访问名为“request”的全局变量,该变量具有一个名为“host”的属性:

@celery_app.task
def my_background_func(foo, bar):
    print "running the task for host:" + request.host
1个回答

0

这是我如何解决它的方法...

class MyTask(Task):
    abstract = True
    def delay(self, *args, **kwargs):
        return self.apply_async(args, kwargs, headers={'host': request.host})

在客户端:

 @celery_app.task(base=MyTask, bind=True)
 def hellohost(task):
     return "hello " +  task.request.headers['host']

它能工作,但奇怪的是hellohost.delay().get()在客户端上挂起了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接