DRF一级视图APIView

2021-12-15 09:29:39 浏览数 (1)

APIView

APIView是Django REST framework提供的所有视图的基类,继承自Django的View类。使用方式:

代码语言:javascript复制
from rest_framework.views import APIView

APIView与View的不同之处在于:

  • 传入到视图方法中的是Django REST framework的Request对象,而不是Django的HttpRequeset对象;
  • 视图方法可以返回Django REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;(需要from rest_framework.response import Response)
  • 任何APIException异常都会被捕获到,并且处理成合适的响应信息;
  • 在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。
  • 不受csrf认证规则的限制,因为由as_view方法完成路由配置,返回配置函数是csrf_exempt(view)。

APIView与View的使用基本相同,像往常一样。依旧是get方法处理get请求,post方法处理post请求。除此之外,APIView增加了一些可插入的属性。最常用的是下面三个。

  • authentication_classes列表或元祖,身份认证类
  • permissoin_classes列表或元祖,权限检查类
  • throttle_classes列表或元祖,流量控制类

基于类的视图

一个继承自APIView的视图可能如下所示:

代码语言:javascript复制
from rest_framework.response import Response
from rest_framework.views import APIView
from book.models import BookInfo
from book.serializers import BookInfoSerializer

# Create your views here.

class BookInfoView(APIView):
    """书籍信息视图"""
    def get(self, request, *args, **kwargs):
        objs = BookInfo.objects.all()
        res = BookInfoSerializer(objs, many=True)

        return Response(res.data)

    def post(self, request, *args, **kwargs):
        data = request.data
        name = data.get("name")
        pub_date = data.get("pub_date")
        obj = BookInfoSerializer(data={"name": name, "pub_date": pub_date})
        if obj.is_valid():
            obj.save()
            return Response(obj.data)
        else:
            return Response(status=400)

关于APIView使用的Django REST framework的Request对象,以及上面使用的Response对象,在DRF的Request对象和Response对象中介绍。

基于函数的视图

有时候,我们并不需要使用类。为此,DRF提供了一组简单的装饰器,用于包装基于函数的视图以确保它们接收DRF的Request对象。

api_view()装饰器

api_view装饰器确保视图函数接收DRF的Request对象,此外还提供了请求方法限制。默认情况下只GET接受方法。其他方法将响应“405 Method Not Allowed”。一个可能的例子如下所示:

代码语言:javascript复制
from rest_framework.decorators import api_view
@api_view(['GET', 'POST'])
def hello_world(request):
    if request.method == 'POST':
        return Response({"message": "Got some data!", "data": request.data})
    return Response({"message": "Hello, world!"})

API策略装饰器

为了覆盖默认设置,REST framework 提供了一组额外的装饰器,可以添加到您的视图中。注意,这些必须在@api_view装饰器之后。,可用的装饰器如下所示:

代码语言:javascript复制
@renderer_classes(...)
@parser_classes(...)
@authentication_classes(...)
@throttle_classes(...)
@permission_classes(...)

这些装饰器都接受一个参数,该参数必须是类的列表或元组。

参考资料: DRF视图文档

0 人点赞