Не работают асинхронные представления в Django
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'>
Источник: Stack Overflow на русском