首页 > 解决方案 > django rest框架中的异步

问题描述

如何在Django rest框架中实现异步任务?在 python3.7 之后,async.io 成为了 python 语言的一部分,协程也嵌入到了语言中。

但我无法利用它,我不得不使用 celery 和 redis 服务器来实现这种异步行为。


更新

class ReportViewSet(viewsets.ModelViewSet):

    queryset = Report.objects.all()
    serializer_class = ReportSerializer
    filter_class = ReportFilter

    def create(self, request):

        serializer = ReportSerializer(data=request.data)

        if serializer.is_valid(raise_exception=True):
            report_obj = serializer.save()
            #Start multiple tools asynchronously but we need to return the next statement without waiting for those tools to finish
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我试图修改async function运行工具的创建,但我得到错误,你不能在不是协同例程的执行程序中运行这个函数。当我试图使create函数异步时,它返回一个协程而不是一个HTTP response. 因此,django-rest-framework它本身需要将其内部修改为协程类型。关于如何在不使用任何 MQ 或缓存技术的情况下以一种好的方式做我提到的事情的任何建议或想法。

标签: pythondjangopython-3.xdjango-rest-frameworkpython-asyncio

解决方案


你不应该create变成一个异步函数。您应该在其中有一个循环create异步运行所有逻辑,但即使这样也不会在您的异步任务运行时释放工作进程以服务其他请求。您可以在这里做的最好的事情是将任务卸载到 celery,然后通过另一个 API 轮询以检查它们的状态或结果。

Django 是一个同步框架,它不支持您在此处尝试执行的操作。如果您想对重叠请求进行长时间轮询,那么我建议您研究一下龙卷风


推荐阅读