django rest框架中的异步

Posted

技术标签:

【中文标题】django rest框架中的异步【英文标题】:Async in django rest framework 【发布时间】:2019-05-23 11:57:50 【问题描述】:

如何在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 或缓存技术的情况下以一种好的方式做我提到的事情的任何建议或想法。

【问题讨论】:

您面临的问题是什么?你能展示一下你迄今为止提出的代码吗? 你应该看看 django-channels @saad 检查我的更新 你不应该把create 变成一个异步函数。您应该在 create 中有一个循环异步运行所有逻辑。 你能试着在你身边运行它吗?我也试过了,但你必须让创建函数仍然异步! 【参考方案1】:

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

Django 是一个同步框架,它不支持您在此处尝试执行的操作。如果您想对重叠请求进行长轮询,那么我建议您查看tornado

【讨论】:

以上是关于django rest框架中的异步的主要内容,如果未能解决你的问题,请参考以下文章

Django rest框架:防止一个用户删除/编辑/查看ModelViewSet中的其他用户

django rest框架中的只写,只读字段

使用 django-rest 框架中的 GET 方法将 url 作为参数传递?

如何覆盖 django rest 框架( DRF )中的响应类?

Django Rest 框架中的自定义用户模型注册

django框架学习六:优化views.py文件,使用rest_framework中的APIVew和Response返回