我需要满足两项服务的要求。
代码如下:

async def post1(data):
    response = await aiohttp.request('post', 'http://', json=data)
    json_response = await response.json()
    response.close()
    return json_response

async def get2():
    response = await aiohttp.request('get', 'http://')
    json_response = await response.json()
    response.close()
    return json_response

async def asynchronous(parameters):

    task1 = post1(parameters['data'])
    task2 = get2()

    result_list = []
    for body in await asyncio.gather(task1, task2):
        result_list.append(body)
    return result_list


如果我在本地运行代码,就可以了。代码如下:

if __name__ == "__main__":
    ioloop = asyncio.get_event_loop()
    parameters = {'data': data}
    result = ioloop.run_until_complete(asynchronous(parameters))
    ioloop.close()
    print(result)


我得到正确的结果。但是,如果我尝试从DRF方法执行代码,则会发生错误:


  TypeError:对象_SessionRequestContextManager不能用于
  '等待'表达


我运行的示例代码:

 .....
 class MyViewSet(GenericAPIView):
    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        ......

        ioloop = asyncio.get_event_loop()
        result = ioloop.run_until_complete(asynchronous(serializer.data)) # <<<<< error here
        ioloop.close()

        ......
        return Response(serializer.data, status=status.HTTP_201_CREATED)


请告诉我可能是什么问题?

最佳答案

无法等待aiohttp.request返回的对象,必须将其用作异步上下文管理器。这段代码:

response = await aiohttp.request('post', 'http://', json=data)
json_response = await response.json()
response.close()


需要更改为以下内容:

async with aiohttp.request('post', 'http://', json=data) as response:
    json_response = await response.json()


有关更多用法示例,请参见documentation

也许您在运行DRF的服务器上有一个不同的aiohttp版本,这就是为什么它在本地运行并在DRF下失败的原因。

关于python - DRF中的异步请求出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50373051/

10-11 16:20