Не работают асинхронные представления в Django

Рейтинг: 0Ответов: 0Опубликовано: 16.08.2023

ASGI настроена, запускается через uvicorn

from asgiref.sync import sync_to_async
from django.core.exceptions import ObjectDoesNotExist
from django.http import HttpResponse
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework_simplejwt.tokens import RefreshToken, AccessToken

from user.serializers import UserRegistrationSerializer, UserSerializer, UserLoginSerializer


@sync_to_async
def get_tokens_for_user(user):
    refresh = RefreshToken.for_user(user)
    access = AccessToken.for_user(user)
    return {'refresh': str(refresh), 'access': str(access)}


@api_view(['POST'])
async def register(request):
    serializer = UserRegistrationSerializer(data=request.data)
    if serializer.is_valid():
        user = serializer.save()
        token = await get_tokens_for_user(user)
        return HttpResponse(token, status=status.HTTP_201_CREATED)
    return HttpResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


@api_view(['POST', 'GET', 'OPTIONS'])
async def login(request):
    if request.method == 'GET':
        try:
            user = request.user
            serializer = UserSerializer(user)
            return HttpResponse(serializer.data, status=status.HTTP_200_OK)
        except ObjectDoesNotExist:
            return HttpResponse({'error': 'User not found'}, status=status.HTTP_404_NOT_FOUND)
    elif request.method == 'OPTIONS':
        return HttpResponse({'Allow': 'GET, POST'}, status=status.HTTP_200_OK, headers={
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Methods': 'GET, POST',
            'Access-Control-Allow-Headers': 'Content-Type, Authorization'
        })
    else:
        try:
            serializer = UserLoginSerializer(data=request.data)
            serializer.is_valid(raise_exception=True)
            user = serializer.validated_data['user']
            token = await get_tokens_for_user(user)
            return HttpResponse(token, status=status.HTTP_200_OK)
        except ValueError as e:
            return HttpResponse({'message': str(e)}, status=status.HTTP_400_BAD_REQUEST)

AssertionError: Expected a Response, HttpResponse or HttpStreamingResponse to be returned from the view, but received a <class 'coroutine'>

Ответы

Ответов пока нет.