Dado que Django ahora admite vistas asíncronas, estoy tratando de cambiar mi base de código que contiene muchas vistas basadas en funciones para que sean asíncronas, pero por alguna razón no funciona.
@api_view(["GET"]) async def test_async_view(request): ... data = await get_data() return Response(data)Cuando envío una solicitud a este punto final, aparece un error que dice:
AssertionError: se esperaba que se devolviera una
Response,HttpResponseoHttpStreamingResponsedesde la vista, pero recibió una<class 'coroutine'>
¿DRF aún no admite vistas asíncronas? ¿Hay alguna alternativa que pueda hacer para que esto funcione?
A partir de ahora, DRF no admite "vistas de API" asíncronas. Aquí hay un tema abierto (#7260) en la comunidad DRF y todavía está en la etapa de discusión.
Pero, Django proporciona un decorador/envoltorio que nos permite convertir nuestras vistas/funciones de sincronización en asíncronas usando sync_to_async(...) .
Ejemplo,
@sync_to_async @api_view(["GET"]) def sample_view(request): data = get_data() return Response(data) Tenga en cuenta que, aquí, sample_view(...) y get_data(...) son funciones de sincronización.
Creo que puedes usar este decorador en DRF
import asyncio from functools import wraps def to_async(blocking): @wraps(blocking) def run_wrapper(*args, **kwargs): return asyncio.run(blocking(*args, **kwargs)) return run_wrapperEjemplo de uso
@to_async @api_view(["GET"]) async def sample_view(request): ...