Задать вопрос
@anapty-xy

Почему Django rest framework не распознает асинхронное представление?

views.py

@api_view(['POST'])
@permission_classes([AllowAny])
async def create_table(request):
    table_title = request.data.get['table_title']
    cols = request.data.get['cols'].split(';')
    rows = request.data.get['rows']
    async with pool.DB_POOL.acquire() as connection:
        create_statment = f'''CREATE TABLE IF NOT EXISTS {table_title}\n'''
        for col in cols:
            create_statment += f'{col} TEXT NOT NULL,\n'
        await connection.execute(create_statment)
    return Response(
        {'proccess': 'done'},
        status=status.HTTP_201_CREATED
    )


asgi.py

'''определение промежуточного слоя DBPoolMiddleware для инициализации и закрытия пула подключений в соответствии с состоянием сервера'''

import os
from django.core.asgi import get_asgi_application
import django
from . import pool

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')

application = get_asgi_application()

class DBPoolMiddleware:
    def __init__(self, app):
        self.app = app

    async def __call__(self, scope, receive, send):
        if scope['type'] == 'lifespan':
            while True:
                message = await receive()
                if message['type'] == 'lifespan.startup':
                    django.setup()
                    await pool.create_db_pool()
                    await send({'type': 'lifespan.startup.complete'})
                elif message['type'] == 'lifespan.shutdown':
                    await pool.shutdown_pool()
                    await send({'type': 'lifespan.shutdown.complete'})
                    break
                else:
                    break
        else:
            await self.app(scope, receive, send)

application = DBPoolMiddleware(application)


settings.py

WSGI_APPLICATION = 'config.wsgi.application'
ASGI_APLICATION = 'config.asgi.aplication'


requirements.txt

asgiref==3.10.0
asyncpg==0.30.0
cffi==2.0.0
click==8.3.0
colorama==0.4.6
cryptography==46.0.3
Django==5.2.8
djangorestframework==3.16.1
h11==0.16.0
jwt==1.4.0
pycparser==2.23
sqlparse==0.5.3
tzdata==2025.2
uvicorn==0.38.0


запускаю сервер командой uvicorn config.asgi:application --host 0.0.0.0 --port 8000, после отправляю запрос постманом
поднимается ошибка AssertionError: Expected a `Response`, `HttpResponse` or `StreamingHttpResponse` to be returned from the view, but received a class coroutine
современные версии джанго же должны поддерживать асинхронные представления без дополнительных декораторов.

ps. знаю про инъекции, но пока просто экспериментирую
  • Вопрос задан
  • 40 просмотров
Подписаться 1 Простой 3 комментария
Помогут разобраться в теме Все курсы
  • Skillfactory
    Python-разработчик за 3 месяца
    3 месяца
    Далее
  • Академия Eduson
    Fullstack-разработчик на Python
    3 дня
    Далее
  • Shultais Education
    Django 5, уровень 2
    10 недель
    Далее
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
С async у DRF всё плохо, есть специальная либа где попытались это исправить adrf, но так себе, на DRF лучше писать только синхронный REST.
Если нужен async REST, то тут либо fastapi и т.п, либо https://github.com/wemake-services/django-modern-rest но эти вот недавно появились, так что только для попробовать, хотя очень многообещающие
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы