前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DRF一级视图APIView

DRF一级视图APIView

作者头像
zy010101
发布2021-12-15 09:29:39
8960
发布2021-12-15 09:29:39
举报
文章被收录于专栏:程序员

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视图文档

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • APIView
    • 基于类的视图
      • 基于函数的视图
        • api_view()装饰器
        • API策略装饰器
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档