django休息框架中的异步

Moh*_*mza 5 python django python-3.x django-rest-framework python-asyncio

如何在Django休息框架中实现异步任务?在python3.7之后,async.io成为了python语言的一部分,并且协同程序嵌入了该语言中.

但我不能利用它我必须使用芹菜和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)
Run Code Online (Sandbox Code Playgroud)

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

Saa*_*eem 2

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

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