【发布时间】: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中有一个循环异步运行所有逻辑。 -
你能试着在你身边运行它吗?我也试过了,但你必须让创建函数仍然异步!
标签: python django python-3.x django-rest-framework python-asyncio