post请求500_drf-3 请求响应及视图

一/请求

(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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值