我需要满足两项服务的要求。
代码如下:
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/