0

私はインターンで、Ionicフレームワークを使用して同僚が作成したモバイルアプリと対話する必要があるDRF APIを開発するプロジェクトに取り組んでいます。 新しいユーザーを作成しています。私の見解方法は以下の通りです:一般的なビューのDjango REST APIカスタムメソッド

class NewUser(generics.CreateAPIView): 
    model = User 
    permission_classes = [permissions.AllowAny] 
    serializer_class = NewUserSerializer 

    def create(self, request, *args, **kwargs): 
     serializer = self.get_serializer(data=request.data) 
     serializer.is_valid(raise_exception=True) 
     self.perform_create(serializer) 
     headers = self.get_success_headers(serializer.data) 
     token, created = Token.objects.get_or_create(user=serializer.instance) 
     return Response({'token': token.key}, status=status.HTTP_201_CREATED, headers=headers) 
ユーザー名はその後、API 201ステータスコードを返し、JSONでトークン、まだ撮影されてhas't場合、ユーザー名はすでにそれを撮影した場合、誰かが、POSTリクエストを経由して、新規ユーザーを作成したい

JSONで400のステータスとエラーメッセージを返します。私の同僚は、すでに存在する名前のユーザー名を作成しようとすると、ステータスメッセージを200に変更するように要求します。彼はERRORレスポンスを消費することはできないと言います。 彼のコードは次のようになります。

$http.post(url,{ 
username:$scope.tel, 
password:$scope.passwd 
}).success(function(data){ 
alert(data); 
$ionicLoading.hide(); 
console.log(data); 
}) 

質問: 1)私はエラー '既に登録ユーザのための代わりに複数の論理400の200件のステータスを送信するために私のAPIを微調整する必要がありますか? 私のコードを変更しようとしましたが、DRFのCreateAPIView/ModelSerializerでオーバーライドするメソッドが見つかりませんでした。私はこの方法に私のビュークラスを書き換えてしまった:

@api_view(['POST']) 
def newUser(request): 
    """ 
    Saves a new user on the database 
    """ 
    if request.method == 'POST': 

     serializer = NewUserSerializer(data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      token, created = Token.objects.get_or_create(user=serializer.instance) 
      return Response({'token': token.key}, status=status.HTTP_201_CREATED, headers=serializer.data) 
     else: 
      return Response(serializer.errors, status=status.HTTP_200_OK) 

質問: 2)私は)どの方法私は 3をオーバーライドする必要があり、APIとresponce behaviorof変更したい場合は、私はジャンゴに新たなんだと、まだドン」私たちは一般的なビューを使用する必要があります知っている。 @ ....方法

答えて

0

この場合の200対400はほとんど優先されます。 400は「不良リクエスト」を意味します。これは、一般的に、不正な形式の要求ではなく、条件を満たさない要求よりも正しいものです。

あなたの要求が有効だったが、私は新しいレコードを作成していない:

200は、それが正しい情報を伝えるだけで、必要に応じています。

オーバーライド方法については、最短のパスはCreateAPIView.createを上書きし、使用する応答コードを変更することです。また、CreateAPIViewという既定の動作を繰り返すことも避けてください。superを呼び出す必要があります。個人的に

class CreateUserView(generics.CreateAPIView): 
    model = User 
    permission_classes = [permissions.AllowAny] 
    serializer_class = NewUserSerializer 

    def create(self, request, *args, **kwargs): 
     response = super(CreateUserView, self).create(request, *args, **kwargs) 
     token, created = Token.objects.get_or_create(user=serializer.instance) 
     response.status = status.HTTP_200_OK 
     response.data = {'token': token.key} 
     return response 

、私はまた、私はViewでその作業を行う必要はありませんでしたので、トークン・フィールドを持ち、トークンを処理するために、私のNewUserSerializerを作り上げているだろう。それはViewに属しません。

+0

ご注意いただきありがとうございますが、コードではシリアライザを作成する部分が欠落しています。だから、行のトークンにグローバル名が定義されていないというエラーがあります。created = Token.objects.get_or_create(user = serializer.instance) –

+0

十分なことに、本当に重要なのはすべて応答ステータスの変更です。しかし、もう一度、あなたがここで心配するのが間違っているので、コードを複製することになります。シリアライザ 'save'の一環として' Token'の作成をして、ビュー内にこのビジネスロジックをまったく持っていないようにして、スーパークラスからコピー貼り付けコードを避けてください。 – John

関連する問題