![](/img/trans.png)
[英]Django Celery - Passing an object to the views and between tasks using RabbitMQ
[英]Passing User object in celery using django
我正在編輯我的一個模型中的save方法,這樣我就可以保存更改對象或創建新對象的人。
目前,它在主線程中運行時工作正常,但是save方法也通過Celery用於不同的任務。 當在任務中運行save方法時, get user
返回None
。 為了得到一個用戶我正在使用django-curser,因為這個模型正在我的Django項目中的不同應用程序中使用。
有沒有辦法將當前用戶發送到芹菜? 我被告知使用上下文管理器或包裝器,但我不知道如何。
我的保存方法是:
def save(self, *args, **kwargs):
from models import Log
log_entry = Log()
log_entry.object_id = self.id
log_entry.object_repr = self
user = CuserMiddleware.get_user()
log_entry.user = user
log_entry.content_type_id = ContentType.objects.get_for_model(self).id
log_entry.save()
謝謝。
我想你可以使用這個裝飾器在celery任務中添加用戶
from functools import wraps
def append_user(func):
@wraps(func)
def __wrapper__(*args, **kwargs):
user_login = kwargs.pop('user_login')
CuserMiddleware.set_user(user_login)
return func(*args, **kwargs)
return __wrapper__
並以這種方式應用於任務
@task
@append_user
def celery_job():
pass
同樣對於我的芹菜任務,我使用這個裝飾器(關閉設置中的所有異步作業)
def async_task(func):
from django.conf import settings
ALL_TASKS_IS_ASYNC = getattr(settings, 'ALL_TASKS_IS_ASYNC', True)
@wraps(func)
def __wrapper__(*args, **kwargs):
async = kwargs.pop('async', ALL_TASKS_IS_ASYNC)
if async:
return func.delay(*args, **kwargs)
else:
return func(*args, **kwargs)
return __wrapper__
和__init__.py
文件中的celery_job = async_task(celery_job)
您可以使用相同的想法將user_login
附加到所有任務
def async_task(func):
from django.conf import settings
ALL_TASKS_IS_ASYNC = getattr(settings, 'ALL_TASKS_IS_ASYNC', True)
@wraps(func)
def __wrapper__(*args, **kwargs):
kwargs['user_login'] = CuserMiddleware.get_user().username
async = kwargs.pop('async', ALL_TASKS_IS_ASYNC)
if async:
return func.delay(*args, **kwargs)
else:
return func(*args, **kwargs)
return __wrapper__
我認為這個裝飾可能會優化重構:
def task_with_user_info(func):
@wraps(func)
def __wrapper__(*args, **kwargs):
user = CuserMiddleware.get_user()
kwargs['user_login'] = user.username
return func(*args, **kwargs)
if getattr(func, 'delay', None):
__wrapper__.delay = task_with_user_info(func.delay)
return __wrapper__
@task_with_user_info
@task
@append_user
def celery_job():
pass
在此更改后,您應該像往常一樣使用celery_job
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.