Прозрачная передача контекста веб-запроса задаче celery

У меня есть многопользовательская установка, в которой я хотел бы передать определенную информацию о клиенте, в частности request.host, в задачу celery, где в идеале она должна быть доступна в глобальной переменной. Есть ли способ настроить это так, чтобы это было прозрачно для приложения?

задача будет называться так же:

my_background_func.delay(foo, bar)

задача определяется таким же образом, за исключением того, что она имеет доступ к глобальной переменной с именем «запрос», имеющей атрибут «хост»:

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

person vrtx54234    schedule 13.02.2014    source источник
comment
См. этот ответ.   -  person doru    schedule 13.07.2015


Ответы (1)


вот как я это решил...

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() зависает на клиенте

person vrtx54234    schedule 14.02.2014