Tutorial 2: Requests and Responses

官方文档: https://www.django-rest-framework.org/tutorial/2-requests-and-responses/

5496781-0c720601e15a3406.png
概览.png

1. Request objects

    1. extends the reqular HttpRequest
    1. request.POST
      Only handles form data. Only works for 'POST' method
    1. request.data
      Handles arbitrary data. Works for 'POST', 'PUT' and 'PATCH' methods

2. Response objects

    1. a type of TemplateResponse
    1. return Response(data)
      Renders to content type as requested by the client

3. Status codes

    1. status module

4. Wrapping API Views

    1. The @api_view decorator for working with function based views
    1. The APIView class for working with class-based views
    1. receive Request instances in view, and adding context to Response objects
    1. The wrappers also provide behaviour such as returning 405 Method Not Allowed responses when appropriate, and handling any ParseError exception that occurs when accessing request.data with malformed input

5. Pulling it all together

1. views.py

1. list 方法
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer


@api_view(['GET', 'POST'])
def snippet_list(request, format=None):
    """
    List all code snippets, or create a new snippet.
    """
    if request.method == 'GET':
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = SnippetSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
2. detail 方法
@api_view(['GET', 'PUT', 'DELETE'])
def snippet_detail(request, pk, format=None):
    """
    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)

2. snippets/urls.py

from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views

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

urlpatterns = format_suffix_patterns(urlpatterns)

猜你喜欢

转载自blog.csdn.net/weixin_33827590/article/details/90958374
今日推荐