簡體   English   中英

使用django在芹菜中傳遞User對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM