【问题标题】:How to make a couple of async method calls in django2.0如何在 django2.0 中进行几个异步方法调用
【发布时间】:2018-08-17 06:24:09
【问题描述】:

我在做一个小项目,决定用Django2.0和python3.6+。

在我的 django 视图中,我想调用一堆 REST API 并获取它们的结果(以任何顺序),然​​后处理我的请求(将某些内容保存到数据库)。

我知道正确的做法是使用aiohttp 并定义一个async 方法并等待它。

我对@9​​87654324@ 以及如果视图方法必须await 这些方法的响应是否应该是异步方法感到困惑。

Django2.0 本身(在 python3.6+ 中实现)也有我可以添加到的循环吗?

这是我所设想的视图

from rest_framework import generics
from aiohttp import ClientSession
class CreateView(generics.ListCreateAPIView):
  def perform_create(self, serializer):
    await get_rest_response([url1, url2])

async def fetch(url):
  async with session.get(url) as response:
    return await response.read()

async def get_rest_response(urls):
   async with ClientSession() as session:
      for i in range(urls):
        task = asyncio.ensure_future(fetch(url.format(i), session))
        tasks.append(task)
    responses = await asyncio.gather(*tasks)

【问题讨论】:

  • 虽然 Django 支持包含 asyncio (3.4+) 的所有 Python 版本,但 Django 2.0 不使用 asyncio,因此没有事件循环。你可能想看看Channels

标签: python-3.6 python-asyncio aiohttp django-2.0


【解决方案1】:

从技术上讲,您可以通过loop.run_until_complete() 致电:

class CreateView(generics.ListCreateAPIView):
  def perform_create(self, serializer):
    loop = asyncio.get_event_loop()
    loop.run_until_complete(get_rest_response([url1, url2]))

但我怀疑这种方法是否会显着加快您的代码速度。 无论如何,Django 是一个同步框架。

【讨论】:

  • 感谢您的建议。我正在考虑这样做,但似乎我这样做只是为了能够使用 asyncio 进行调用。因为你的答案是最接近的。我会接受答案。
猜你喜欢
  • 2020-11-09
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
相关资源
最近更新 更多