Requests and Responses
https://www.django-rest-framework.org/tutorial/2-requests-and-responses/
Request
请求类,扩展了 httprequest类。
请求数据存储在 request.data 成员中。
REST framework introduces a
Request
object that extends the regularHttpRequest
, and provides more flexible request parsing. The core functionality of theRequest
object is therequest.data
attribute, which is similar torequest.POST
, but more useful for working with Web APIs.
request.POST # Only handles form data. Only works for 'POST' method. request.data # Handles arbitrary data. Works for 'POST', 'PUT' and 'PATCH' methods.
Response
响应类。
响应数据存放在类的实例化中, 作为客户端数据响应。
REST framework also introduces a
Response
object, which is a type ofTemplateResponse
that takes unrendered content and uses content negotiation to determine the correct content type to return to the client
return Response(data) # Renders to content type as requested by the client.
Wrapping API views
提供了两种 API view的封装,
一种是 使用 @api_view
来修饰 django view函数。
另一种是 定义 APIView
类, 在此类中定义 get post 方法, 对应 http的方法名。
REST framework provides two wrappers you can use to write API views.
- The
@api_view
decorator for working with function based views.- The
APIView
class for working with class-based views.These wrappers provide a few bits of functionality such as making sure you receive
Request
instances in your view, and adding context toResponse
objects so that content negotiation can be performed.
对于获取所有 和 创建操作,定义 view
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): """ 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)
对于单个获取 修改 删除, 定义view
@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)