rest_framework - django-rest-swagger: ¿Cómo puedo especificar el parámetro para las solicitudes POST mientras uso APIView?
rest framework django 2 (2)
Este es el marco de trabajo obtener el código de esquema (la parte del mismo):
def get_serializer_fields(self, path, method, view):
"""
Return a list of `coreapi.Field` instances corresponding to any
request body input, as determined by the serializer class.
"""
if method not in (''PUT'', ''PATCH'', ''POST''):
return []
if not hasattr(view, ''get_serializer''):
return []
serializer = view.get_serializer()
if isinstance(serializer, serializers.ListSerializer):
return [
coreapi.Field(
name=''data'',
location=''body'',
required=True,
type=''array''
)
]
...
Como puede ver, debería funcionar si define el método get_serializer
en su vista, que devuelve el UserAuthenticationSerializer
.
- EDITAR -
Olvídate: feliz codificación.
En la última versión de dajngo rest swagger (2.1.0), las cadenas de documentos YAML han quedado en desuso. No puedo mostrarme arrogante para mostrar los parámetros de solicitud POST.
Aquí está mi vista
class UserAuthenticationView(APIView):
def post(self, request, *args, **kwargs):
serializer = UserAuthenticationSerializer(data=self.request.data)
if serializer.is_valid():
user = serializer.validated_data[''user'']
return Response({''token'': user.auth_token.key}, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_401_UNAUTHORIZED)
Aquí está mi serializador
class UserAuthenticationSerializer(serializers.Serializer):
username = serializers.CharField()
password = serializers.CharField()
def validate(self, attrs):
username = attrs.get(''username'')
password = attrs.get(''password'')
if username and password:
user = authenticate(username=username, password=password)
if user:
if not user.is_active:
msg = ''User account is disabled.''
raise serializers.ValidationError(msg, code=''authorization'')
else:
msg = ''Unable to log in with provided credentials.''
raise serializers.ValidationError(msg, code=''authorization'')
else:
msg = ''Must include "username" and "password".''
raise serializers.ValidationError(msg, code=''authorization'')
attrs[''user''] = user
return attrs
Esto es lo que obtengo en mi generado
No obtengo un formulario con los campos para los datos POST. ¿Cómo lo consigo?
django-rest-swagger utiliza rest_framework.schemas.SchemaGenerator para generar el esquema y SchemaGenerator usa get_serializer_fields para obtener la información del serializador de una vista. get_serializer_fields comprueba si una vista tiene un método get_serializer para generar el formulario. GenericAPIView proporciona el get_serializer por lo que heredar de él es suficiente.
Heredar vista desde GenericAPIView
lugar de APIView
simple. Y agrega el atributo serializer_class
con el serializador apropiado
from rest_framework.generics import GenericAPIView
class UserAuthenticationView(GenericAPIView):
serializer_class = UserAuthenticationSerializer
def post(self, request, *args, **kwargs):
serializer = UserAuthenticationSerializer(data=self.request.data)
if serializer.is_valid():
user = serializer.validated_data[''user'']
return Response({''token'': user.auth_token.key}, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_401_UNAUTHORIZED)