我有一个将get_response
方法设置为协程的中间件,以便可以一起运行另一个任务:
class AsyncMiddleware:
def __init__(self, get_response):
self.get_response = asyncio.coroutine(get_response)
def __call__(self, request):
tasks = [self.get_response(request), <OTHER_ASYNC>]
response, *other_response = asyncio.run(self.gather(tasks))
return response
async def gather(self, tasks):
return await asyncio.gather(*tasks)
在我的django视图中,我需要使用django通道根据PATCH请求将任务发送给工作人员。当我尝试将任务添加到循环中时,响应完成,我的模型已更新,但任务从未发送给我的工作人员。
loop = asyncio.get_event_loop()
channel_layer = get_channel_layer()
result = loop.create_task(channel_layer.send(
'model-update',
{
'type': 'update',
'data': {}
},
))
我尝试了此代码的许多不同变体。如果我从中间件中删除了异步代码并在asigref中使用了async_to_sync
,那么一切都会按预期进行(这不是一个真正的选择,因为async_to_sync
不能在运行循环中使用)