Django REST FRAMEWORK Tutorial 9 -- snippet_detail の GET/PUT/DELTE を APIView で作成する

14909 단어 django
https://www.django-rest-framework.org/tutorial/2-requests-and-responses/#pulling-it-all-together

Django REST 프레임워크 の snippet_detail を

@csrf_exempt
  def snippet_detail(request, pk):


CSRF の検出除外에서

@api_view(['GET', 'PUT', 'DELETE'])
  def snippet_detail(request, pk):


API 보기 に書き直す.
これによって DjangoRestFramework の管理画面がBlauzaで使える.

from django.http import HttpResponse


HttpResponse を使ったのを

from rest_framework.response import Response


REST 프레임워크 の Response に変更

    try:
        snippet = Snippet.objects.get(pk=pk)
    except Snippet.DoesNotExist:
        return HttpResponse(status=404)


이, HttpResponse を

        return Response(status=status.HTTP_404_NOT_FOUND)


Response にして、 status.HTTP_404_NOT_FOUND を返すようにする

前回の記事で削除した snippets/2 をブラウザで見ると



ちゃんと 404 で DRF の管理画面で表示されている.

しかし、api_view を入れずに csrf_exempt のままだと

"GET /snippets/2/ HTTP/1.1" 500 59081





404 에서 500 が返っ て き て し ま う.

404 は想定されるエラーで、500 はちゃんと想定で きていない、Systemの作りが甘い시계に出るエラーなんだなぁ말하는 것과 が理解できた

가져 오기




    if request.method == 'GET':
        serializer = SnippetSerializer(snippet)
        return Response(serializer.data)


GET の Json레스폰스모 레스폰스에 하는 일로



DRF の管理画面で綺麗に見れる.

넣기, 삭제




    elif request.method == 'PUT':
        serializer = SnippetSerializer(snippet, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        snippet.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)


PUT 와 DELETE も snippet_list の時のように
DRF 의 응답 및 HTTP 스테이터스를 사용하기 위한 문서입니다.
こちらの方が 204 がなんだっけって考えずに済むので可読性が高い.



PUT 와 DELETE は, この詳細画面でボtanから行える.

snippet_detail 전 체



@api_view(['GET', 'PUT', 'DELETE',])
def snippet_detail(request, pk):
    """
    Retrieve, update or delete a code snippet.
    """
    try:
        snippet = Snippet.objects.get(pk=pk)
    except Snippet.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        serializer = SnippetSerializer(snippet)
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = SnippetSerializer(snippet, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        snippet.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)


format=없음 をつける



https://www.django-rest-framework.org/tutorial/2-requests-and-responses/#adding-optional-format-suffixes-to-our-urls

format=None をつけると .json などの format 接尾辞をつけてrichestをできるらしい



def snippet_list(request):
def snippet_detail(request, pk):


snippet_list, snippet_detail, の引数に

def snippet_list(request, format=None):
def snippet_detail(request, pk, format=None):


format=없음 をつけて

스니펫/urls.py 에

from rest_framework.urlpatterns import format_suffix_patterns

urlpatterns = format_suffix_patterns(urlpatterns)


urlpatterns を format_suffix_patterns をかける





すると、拡張子に応じて DRF の管理画面と json のみを返すものと切り替えられる.


まとめ




from rest_framework.decorators import api_view

@api_view(['GET', 'PUT', 'DELETE'])


rest_framework の api_view 에서
snippet_detail など各関数(endpoint?) で 使う HTTP 메소드를 記述して

from rest_framework import status
from rest_framework.response import Response

return Response(serializer.data, status=status.HTTP_201_CREATED)


rest_framework 의 상태, 응답 으로
このように status.HTTP_201_CREATED , status.HTTP_204_NO_CONTENT , status.HTTP_400_BAD_REQUEST , status.HTTP_404_NOT_FOUND , これらを使うようにする.

좋은 웹페이지 즐겨찾기