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

9687 단어 django

何をやるのか



前々回の記事と前回の記事で、snippet_list の一覧の APIを CSRF_EXEMPT 와 API_VIEW で GET/POST できるようにした.

今回は snippet_detail の詳細の API を CSRF検証を無効化して作成する


snippets/urls に snippet_detail のruーtingingを追加




urlpatterns = [
    path('snippets/', views.snippet_list),
    path('snippets/<int:pk>/', views.snippet_detail),
]


snippets/1 や snippets/99 のパスにアクセスした時に見るところを
views の snippet_detail に設定する


스니펫/뷰 に snippet_detail を記載




@csrf_exempt
def snippet_detail(request, pk):
    """
    Retrieve, update or delete a code snippet.
    """
    try:
        snippet = Snippet.objects.get(pk=pk)
    except Snippet.DoesNotExist:
        return HttpResponse(status=404)

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

    elif request.method == 'PUT':
        data = JSONParser().parse(request)
        serializer = SnippetSerializer(snippet, data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)

    elif request.method == 'DELETE':
        snippet.delete()
        return HttpResponse(status=204)


모델로부터의 오브제크트의 取り出し,
GET/PUT/DELETE 의 JSON 응답 처리
これらを書いている
一つ一つ見ていく


CSRF 検証無効化와 요청 및 pk




@csrf_exempt
def snippet_detail(request, pk):


最初に CSRF 検証無視を記載
요청 と pk を受け取る
기본 키, 츠마리 id


Snippet 모델로부터 오브제크트を取得、例外処理




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


受け取った pk からデータを取り、変数 스니펫 に入れる
それがなくて失敗したら、404 を返す

가져 오기




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


GET の 時は普通にmodel에서 取り出した データタを
시리아라이즈라고 JSON 레스폰스로 설명


놓다




    elif request.method == 'PUT':
        data = JSONParser().parse(request)
        serializer = SnippetSerializer(snippet, data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)


PUT の時는 요청 の中身을 JSON 파서에 かけて
시리아라이자 にかけて, 中身があれば JSON 응답으로 返す.


삭제




    elif request.method == 'DELETE':
        snippet.delete()
        return HttpResponse(status=204)


DELETE の時は単に取ってきたOBJECT에 .delete() をかけて
레스폰스노 404 を返している

POST는 없습니다.
snippet_detail では既にあるものにアクセスしてるからだ.


まとめ



snippet_detail 에서는
Snippet 모델로부터 渡された id(pk) のデータをとって
なかった場合は 404 を返して
GET の場合はシリアライズし て JSON で返す
PUT の場合は JSON 파서시て시리아라이즈に成功すれば保存
失敗すれば 400 에라를 返す
DELETE の場合は delete() をかけて 204 を返す

これで詳細ページの API が作れた

좋은 웹페이지 즐겨찾기