请求和响应

请求和响应

请求request

常用属性:request.data,前端三种编码方式传过来都可以取出来

request.query_params和request.GET的属性一样。这个是二次封装后的属性

响应response

REST framework提供了一个响应类Response,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。

REST framework提供了Renderer 渲染器,用来根据请求头中的Accept(接收数据类型声明)来自动转换响应数据到对应格式。如果前端请求中未进行Accept声明,则会采用默认方式处理响应数据,我们可以通过配置来修改默认响应格式。

可以在rest_framework.settings查找所有的drf默认配置项:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (  # 默认响应渲染类
        'rest_framework.renderers.JSONRenderer',  # json渲染器
        'rest_framework.renderers.BrowsableAPIRenderer',  # 浏览API渲染器
    )
}
# 在视图类中
局部使用: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渲染器
            )
        }

常用属性

data: 返回的数据,是一个字典
status:返回的状态码,默认是200
tempalte_name:渲染的模板
headers:响应头
content_type: 响应的编码格式,application/json/text
    

视图

基于APIView写的接口


class BookAPIView(APIView):
    def get(self,request,pk):
        book = models.Book.objects.filter(pk=pk).first()
        book_ser = ser.BookSerializers(book)
        return Response(book_ser.data)

    def put(self,request,pk):
        response_msg = {'status':100,'msg':""}
        book = models.Book.objects.filter(pk=pk).first()
        book_ser = ser.BookSerializers(instance=book,data=request.data)
        if book_ser.is_valid():
            book_ser.save()
        else:
            response_msg['status'] = 101
            response_msg['msg'] = '失败'
            response_msg['data'] = request.data
        return Response(request.data)

    def delete(self,request,pk):
        response_msg = {'status': 100, 'msg': ""}
        book = models.Book.objects.filter(pk=pk).delete()

        return Response(response_msg)

class BookSAPIView(APIView):
    def post(self,request):
        book = ser.BookSerializers(data=request.data)
        if book.is_valid():
            book.save()
        return Response(book.data)

    def get(self, request):
        book = models.Book.objects.all()
        book_ser = ser.BookSerializers(book,many=True)
        return Response(book_ser.data)

基于 GenericAPIView

rom rest_framework.generics import GenericAPIView
class Book2View(GenericAPIView):
    queryset = models.Book.objects
    serializer_class = ser.BookSerializers
    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 = models.Book.objects.filter(pk=pk).first()
        book_ser = ser.BookSerializers(instance=book,data=request.data)
        if book_ser.is_valid():
            book_ser.save()
        return Response(request.data)

    def delete(self,request,pk):
        response_msg = {'status': 100, 'msg': ""}
        models.Book.objects.filter(pk=pk).delete()
        return Response(response_msg)


class Books2View(GenericAPIView):
    queryset = models.Book.objects
    serializer_class = ser.BookSerializers

    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 = self.get_serializer(data=request.data)
        if book.is_valid():
            book.save()
        return Response(book.data)
url:
url(r'^book2/(?P<pk>\d+)/', views.Book2View.as_view()),
url(r'^books2/', views.Books2View.as_view()),

GenericAPIView+5 个视图扩展类


from rest_framework.mixins import ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin
class Book3View(GenericAPIView,RetrieveModelMixin,DestroyModelMixin,UpdateModelMixin):
    queryset = models.Book.objects
    serializer_class = ser.BookSerializers
    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)

class Books3View(GenericAPIView,ListModelMixin,CreateModelMixin):
    queryset = models.Book.objects
    serializer_class = ser.BookSerializers

    def get(self, request):
        return self.list(request)

    def post(self,request):
        return self.create(request)
url:
url(r'^book3/(?P<pk>\d+)/', views.Book3View.as_view()),
url(r'^books3/', views.Books3View.as_view()),

使用ModelViewSet编写5个接口

from rest_framework.viewsets import ModelViewSet
class Book4View(ModelViewSet):
    queryset = models.Book.objects
    serializer_class = ser.BookSerializers

url:
url(r'^book4/(?P<pk>\d+)/', views.Book4View.as_view(actions={'get':'retrieve','post':'update','delete':'destroy'})),
url(r'^books4/', views.Book4View.as_view(actions={'get':'list','post':'create'}))

只要使用了ModelViewSet就要重新配置路由

继承ViewSetMixin的视图类

# views.py
from rest_framework.viewsets import ViewSetMixin
class Book5View(ViewSetMixin,APIView): #一定要放在APIVIew前
    def get_all_book(self,request):
        book_list = Book.objects.all()
        book_ser = BookSerializer(book_list, many=True)
        return Response(book_ser.data)
    
# urls.py
    #继承ViewSetMixin的视图类,路由可以改写成这样
    url(r'^books5/, views.Book5View.as_view(actions={'get': 'get_all_book'})),
posted @ 2020-07-11 18:32  小子,你摊上事了  阅读(94)  评论(0编辑  收藏  举报