首页 > 解决方案 > 在 Celery 任务中处理 Django 表单 - 芹菜任务如何查看表单?

问题描述

用例相当简单。后台事务管理器,它需要这种经典类型的后处理程序:

class MyCreate(CreateView):
    model = MyModel
    fields = '__all__'

    def post(self, request, *args, **kwargs):
        self.form = self.get_form()

        if self.form.is_valid():
            self.object = self.form.save(commit=True)
            return self.form_valid(self.form)
        else:
            return self.form_invalid(self.form)

不使用 保存表单form.save(),而是将表单对象保存在某处(到会话?)启动 Celery 任务,然后该任务将负责运行form.save()

我面临的问题是表单对象根本拒绝序列化,使用 JSON 或 pickle,它只是一个对象太丰富了,启动 Celery 任务需要对参数进行序列化。我可以仅序列化(request.POST)可行的 POST 数据,并将其作为有效的参数传递给 Celery 任务,但我无法从中找到任何方法来重新实例化表单,更不用说formset.

如果我想从我重定向到的视图开始 Celery 任务(例如,实现进度条),那么我将面临更大的挑战,将表单传递给全新的 Django 视图。显而易见的候选人是将其保存到会话中:

self.request.session["my_form_data"] = self.request.POST

但是在 Celery 任务中,我什至无法加载该会话数据(我可能会使用out of view sessions来处理它),或者在视图加载中,然后将其作为参数传递。

目的是 Celery 任务有一个 Form 对象,我们可以从发布的数据中调用 save() 方法,并且通常像处理 Form 一样管理和操作。一种可能性是使用 POST 数据作为初始数据来实例化 ModelForm,然后将其保存,但这显然不是一个解决方案,可能会或可能不会起作用。

简而言之,我正在尝试在 Celery 任务中重新创建一小部分视图上下文,并且考虑到我经常看到 Django 和 Celery 在网上一起提到(而且它们似乎很好地协同工作)我真的很想知道之前如果没有一些我想念的简单或规范的方法来做这件事,我会用一个被破解的解决方案来试验它。

我到处都看到了解决方案的提示。有django-remote-forms承诺序列化表单,但不提供从此类序列化数据重新创建 Form 对象或对象(假设我们可能使用 FormSets)的方法。并且在Django REST framework中有一个 FormSerializer 的提示,但这是一个很大的包和学习包,有很多包袱,在我完成时甚至可能无法满足我的需要。

甚至有关于序列化 Django 对象的很好的文档,但没有表单。

如果有一种简单、规范的方法将 Django Form 对象传递给 Celery Task 以便它可以像 Django 视图一样使用它,那将是一个梦想。

标签: pythondjangodjango-formsdjango-viewscelery

解决方案


推荐阅读