rq enqueue function: fails with TypeError:function_xxx() takes 2 positional arguments but 3 were given

rq enqueue function: fails with TypeError:function_xxx() takes 2 positional arguments but 3 were given

这困扰了我几个小时,我似乎还没有找到解决办法。

我正在使用 django-rq 对一些较长的 运行ning 任务进行排队。在我的 tasks.py 中,我有以下内容:

from django_rq import job
@job
def long_running_task(hash, url, file_path):

     #doing some work

在我的 views.py

def post(self, request, hash, file_path, format=None):
    URL = "http://127.0.0.1:9000/work/"
    task = django_rq.enqueue(long_running_task, hash, URL, file_path)
    print("job result is: ", task.result)
    return JsonResponse({"task_result": task.result})

然而,当我 运行 它时,它失败并显示以下消息-

TypeError: long_running_task() takes 2 positional arguments but 3 were given

很明显,我在这里做了一些愚蠢的事情,但我还无法弄清楚。有人可以让我知道这里发生了什么吗?

移除装饰器后会发生什么?

AFAIU,enqueue 只需要一个函数及其参数和 returns 一个作业。装饰器将函数声明为作业。您需要使用其中之一。

要使用装饰器,您需要执行以下伪操作:

def post(self, request, hash, file_path, format=None):
    URL = "http://127.0.0.1:9000/work/"
    task = long_running_task.delay(hash, URL, file_path)
    # wait some time for completion
    print("job result is: ", task.result)
    return JsonResponse({"task_result": task.result})

奇怪的是,这似乎是一种循环依赖类型的问题。以前,我的 tasks.py 文件(我在其中定义 long_running_task)比我的 views.py 文件高一级。我将 tasks.py 文件移动到同一级别,它开始正常工作。不知道为什么会抛出看似无关的错误。