2016-12-12 25 views
3

dajngo rest swagger(2.1.0)の最新バージョンでは、YAMLドキュメントストップは推奨されていません。私はPOST要求パラメータを表示するためにswaggerを得ることができません。ここでdjango-rest-swagger:APIViewを使用してPOSTリクエストのパラメータを指定する方法

は、私の見解ここ

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) 

は私のシリアライザは、これは私が私がのためのフィールドを持つフォームを得ることはありません、私の生成enter image description here

で得るものです

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 

ですPOSTデータ。それをどうやって得るのですか? UserAuthenticationSerializerを返します - あなたはあなたのビューにget_serializerメソッドを定義した場合、それが動作するはずです - あなたが見ることができるように

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' 
      ) 
     ] 
... 

答えて

2

これは、残りのフレームワークは、スキーマのコード(その一部)を取得することです。

- EDIT -

忘れてしまった:ハッピーコーディング。

7

ジャンゴ - 休息 - 闊歩スキーマとSchemaGeneratorは、ビューのシリアライザ情報を取得するためにget_serializer_fieldsを使用して生成するrest_framework.schemas.SchemaGeneratorを使用しています。 get_serializer_fieldsは、フォームにget_serializerメソッドがあるかどうかを確認します。 GenericAPIViewget_serializerを継承していますので十分です。

GenericAPIViewではなくAPIViewからの継承ビュー。適切なシリアライザを使用してserializer_class属性を追加します。

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) 
+0

機能ベースのビューではどのような方法がありますか? –

関連する問題