将 Django 请求对象传递给芹菜任务

passing django request object to celery task

我在 tasks.py 有一个任务是这样的:

@app.task
def location(request):
....

我正在尝试将请求对象直接从几个传递给任务,如下所示:

def tag_location(request):
    tasks.location.delay(request)
    return JsonResponse({'response': 1})

我收到一个错误,我猜它不能被序列化?我该如何解决?麻烦是我也有文件上传对象..它不是所有简单的数据类型。

因为请求对象包含对无法序列化的内容的引用——例如上传的文件或与请求关联的套接字——所以没有通用的序列化方法。

相反,您应该只拉出并传递您需要的部分。例如,类似于:

import tempfile

@app.task
def location(user_id, uploaded_file_path):
    # … do stuff …

def tag_location(request):
    with tempfile.NamedTemporaryFile(delete=False) as f:
        for chunk in request.FILES["some_file"].chunks():
            f.write(chunk)
    tasks.location.delay(request.user.id, f.name)
    return JsonResponse({'response': 1})