一/请求
(1): 请求对象:request
REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了HttpRequest类的Request类的对象。
(2):常用属性
1) .data
request.data是返回解析后的请求体数据 , 类似于django中标准的request.post .所以他有以下特性:
- 包含了解析之后的文件和非文件数据
- 包含了对POST、PUT、PATCH请求方式解析后的数据
- 利用了REST framework的parsers解析器,不仅支持表单类型数据,也支持JSON数据
- 前端三种编码格式传入的数据, 都可以取出来.
2).query_params
request.query_params
与Django标准的request.GET
相同,只是更换了更正确的名称而已。
二/ 响应
REST framework提供了一个响应类Response
,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。
from rest_framework.response import Response
源码:
def __init__(self, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None):
REST framework提供了Renderer
渲染器,用来根据请求头中的Accept
(接收数据类型声明)来自动转换响应数据到对应格式。如果前端请求中未进行Accept声明,则会采用默认方式处理响应数据,我们可以通过配置来修改默认响应格式。
可以在rest_framework.settings查找所有的drf默认配置项:
1) data: 返回的数据,字典类型.
2) statue : 返回的状态码,默认是200
但是: from rest_framework import status 在这个路径下,它把所有使用到的状态码都定义成了常量
为了方便设置状态码,REST framewrok在rest_framework.status
模块中提供了常用状态码常量。
1 信息告知 - 1xx
HTTP_100_CONTINUE
HTTP_101_SWITCHING_PROTOCOLS
2 成功 - 2xx
HTTP_200_OK
HTTP_201_CREATED
HTTP_202_ACCEPTED
HTTP_203_NON_AUTHORITATIVE_INFORMATION
HTTP_204_NO_CONTENT
HTTP_205_RESET_CONTENT
HTTP_206_PARTIAL_CONTENT
HTTP_207_MULTI_STATUS
3 重定向 - 3xx
HTTP_300_MULTIPLE_CHOICES
HTTP_301_MOVED_PERMANENTLY
HTTP_302_FOUND
HTTP_303_SEE_OTHER
HTTP_304_NOT_MODIFIED
HTTP_305_USE_PROXY
HTTP_306_RESERVED
HTTP_307_TEMPORARY_REDIRECT
4 客户端错误 - 4xx
HTTP_400_BAD_REQUEST
HTTP_401_UNAUTHORIZED
HTTP_402_PAYMENT_REQUIRED
HTTP_403_FORBIDDEN
HTTP_404_NOT_FOUND
HTTP_405_METHOD_NOT_ALLOWED
HTTP_406_NOT_ACCEPTABLE
HTTP_407_PROXY_AUTHENTICATION_REQUIRED
HTTP_408_REQUEST_TIMEOUT
HTTP_409_CONFLICT
HTTP_410_GONE
HTTP_411_LENGTH_REQUIRED
HTTP_412_PRECONDITION_FAILED
HTTP_413_REQUEST_ENTITY_TOO_LARGE
HTTP_414_REQUEST_URI_TOO_LONG
HTTP_415_UNSUPPORTED_MEDIA_TYPE
HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE
HTTP_417_EXPECTATION_FAILED
HTTP_422_UNPROCESSABLE_ENTITY
HTTP_423_LOCKED
HTTP_424_FAILED_DEPENDENCY
HTTP_428_PRECONDITION_REQUIRED
HTTP_429_TOO_MANY_REQUESTS
HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE
HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS
5 服务器错误 - 5xx
HTTP_500_INTERNAL_SERVER_ERROR
HTTP_501_NOT_IMPLEMENTED
HTTP_502_BAD_GATEWAY
HTTP_503_SERVICE_UNAVAILABLE
HTTP_504_GATEWAY_TIMEOUT
HTTP_505_HTTP_VERSION_NOT_SUPPORTED
HTTP_507_INSUFFICIENT_STORAGE
HTTP_511_NETWORK_AUTHENTICATION_REQUIRED
3) headers: 响应头,可以往响应头放东西,就是一个字典
4) content_type:响应的编码格式,application/json和text/html;
浏览器响应成浏览器的格式,postman响应成json格式,通过配置实现的(默认配置)
-局部使用:对某个视图类有效
-在视图类中写如下
from rest_framework.renderers import JSONRenderer
renderer_classes=[JSONRenderer,]
-全局使用:全局的视图类,所有请求,都有效
-在setting.py中加入如下
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类
'rest_framework.renderers.JSONRenderer', # json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器
)
}
三/ 视图:
REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写。
(1) APIView写接口:
url.py
url(r'^books/', views.BooksAPIView.as_view()),
url(r'^book/(?P<pk>d+)', views.BookAPIView.as_view()),
models.py
from django.db import models
class Book(models.Model):
id=models.AutoField(primary_key=True)
name=models.CharField(max_length=32)
price=models.DecimalField(max_digits=5,decimal_places=2)
author=models.CharField(max_length=32)
新建的py文件: ser.py
from rest_framework.serializers import ModelSerializer
from app01.models import Book
class BookModelSerializer(ModelSerializer):
class Meta:
model = Book
fields = '__all__'
视图:view.py
from django.shortcuts import render
from rest_framework.serializers import ModelSerializer
from rest_framework.response import Response
from app01.models import Book
from app01.ser import BookModelSerializer
# Create your views here.
from rest_framework.views import APIView
class BooksAPIView(APIView):
def get(self,request):
book=Book.objects.all()
book_ser=BookModelSerializer(book,many=True)
return Response(book_ser.data)
def post(self,request):
book_ser = BookModelSerializer(data=request.data)
if book_ser.is_valid():
book_ser.save()
return Response(book_ser.data)
else:
return Response({'status':101,'msg':'增加失败'})
class BookAPIView(APIView):
def get(self,request,pk):
book=Book.objects.filter(id=pk).first()
book_ser=BookModelSerializer(book)
return Response(book_ser.data)
def put(self,request,pk):
book = Book.objects.filter(id=pk).first()
book_ser = BookModelSerializer(instance=book,data=request.data)
if book_ser.is_valid():
book_ser.save()
return Response(book_ser.data)
else:
return Response({'status': 101, 'msg': '修改失败'})
def delete(self,request,pk):
book=Book.objects.filter(id=pk).delete()
return Response({'statue':100,'msg':'删除成功','data':request.data})
(2) 基于GenericAPIView写接口
url(r'^books1/', views.BooksGenericAPIView.as_view()),
url(r'^book1/(?P<pk>d+)', views.BookGenericAPIView.as_view()),
from rest_framework.generics import GenericAPIView
class BooksGenericAPIView(GenericAPIView):
queryset = Book.objects
serializer_class = BookModelSerializer
def get(self, request):
book=self.get_queryset()
book_ser=self.get_serializer(book,many=True)
return Response(book_ser.data)
def post(self,request):
book_ser=self.get_serializer(data=request.data)
if book_ser.is_valid():
book_ser.save()
return Response(book_ser.data)
else:
return Response({'statue':101,'msg':'增加失败','data':request.data})
class BookGenericAPIView(GenericAPIView):
queryset = Book.objects
serializer_class = BookModelSerializer
def get(self,request,pk):
book=self.get_object()
book_ser=self.get_serializer(book)
return Response(book_ser.data)
def put(self,request,pk):
book=self.get_object()
book_ser=self.get_serializer(instance=book,data=request.data)
if book_ser.is_valid():
book_ser.save()
return Response(book_ser.data)
else:
return Response({'statue':101,'msg':'失败'})
def delete(self,request,pk):
book=self.get_object().delete()
return Response({'statue':100,'msg':'删除成功'})
(3) 基于GenericAPIView和5个视图扩展类写的接口
url(r'^books3/', views.BooksAPIView.as_view()),
url(r'^book3/(?P<pk>d+)', views.BookAPIView.as_view()),
from rest_framework.mixins import ListModelMixin,UpdateModelMixin,RetrieveModelMixin,DestroyModelMixin,CreateModelMixin
class Books3View(GenericAPIView,ListModelMixin,CreateModelMixin):
queryset = Book.objects
serializer_class = BookModelSerializer
def get(self,request):
return self.list(request)
def post(self,request):
return self.create(request)
class Book3View(GenericAPIView,RetrieveModelMixin,DestroyModelMixin,UpdateModelMixin):
queryset = Book.objects
serializer_class = BookModelSerializer
def get(self,request,pk):
return self.retrieve(request,pk)
def put(self,request,pk):
return self.update(request,pk)
def delete(self,request,pk):
return self.destroy(request,pk)
(4) 使用ModelViewSet编写5个接口
url(r'^books4/', views.Book4View.as_view(actions={'get':'list','post':'create'})),
url(r'^book4/(?P<pk>d+)', views.Book4View.as_view(actions={'get':'retrieve','put':'update','delete':'destroy'}))
from rest_framework.viewsets import ModelViewSet
class Book4View(ModelViewSet):
queryset = Book.objects
serializer_class = BookModelSerializer
视图类的继承:
![253b6581182d2aab5b8b5db4e0046129.png](https://i-blog.csdnimg.cn/blog_migrate/61706a001744ecf1dd852e568df3178e.jpeg)