• Django REST Framework API Guide 01


    之前按照REST Framework官方文档提供的简介写了一系列的简单的介绍博客,说白了就是翻译了一下简介,而且翻译的很烂。到真正的生产时,就会发现很鸡肋,连熟悉大概知道rest framework都不算,反正楼主看来,要想真正的将rest玩弄于股掌之内,很明显,那一份样例是远远不够的。所以开辟一个新的REST Framework API Guide系列,这在rest framework的官方文档也还是有的,而且,不用想它是最全面的。这边这个系列的主要目的是为了自己能够抓住生产上的重点,从代码实例上来说明问题,真正的做到关注实例,关注代码。当然如果想看全面的教程建议还是看django rest framework官方文档,那个绝对是最权威的。

    希望大家都能坚持,都能努力,支撑住野心的只有现在的行动,不积跬步无以至千里。加油。

    内容大纲 

      1、requests

      2、response

      3、CBV APIView

      4、FBV @api_view

    1、Requests

    .data

    在rest framework中,对于之前我们所习惯的FBV的格式写法的request的结构进行了改造,从此以后,不需要再去request.GET或则会request.POST取获取必要的参数了。所有的数据基本都可以在request.data内部获取到,注意这里是几乎所有的,但不是全部。

    .query_params

    这里就要去除掉一部分request的数据了,url里面?name=value的查询参数之类的从self.query_params获取。

    .user

    这是一个认证相关的请求数据,如果认证通过,返回django.contrib.auth.models.User实例,反之则是django.contrib.auth.models.AnonymousUser

    .META/.session

    这个自己注意一下

    .method/.content_type

    这种鬼东西,可以忘记了。

    2、Response

    RESTframework提供了一个标准的Response方法的类供调用。

    Response(data, status=None, template_name=None, headers=None, content_type=None)

    上面的调用一看就知道了,大概正常情况下只需要一个data就可以了,除非是刁钻的自定义。那就自己玩去吧。

    .data

    响应的序列化的数据

    .status_code

    这是标准的HTTP请求返回的数字状态码,前端根据状态码判断有没有成功,比如大家熟悉的404.

    .content/.template_name

    了解但不是很重要的参数

    Response的扩展

    response = Response()
    response['Cache-Control'] = 'no-cache'

    这种东西,一看就懂,就不多说了,可以往reponse实例里面添加额外的参数.

    3、Class-based Views(CBV)

    这里主要介绍的是继承Django views的扩展视图类。

    APIView

    APIView跟正常的View类还是有很多区别的

      a、到达处理函数的请求将会是rest framework的请求实例,而不是Django的HttpResponse实例

      b、此类的处理函数返回的是rest framework的Reponse对象,而不是HttpResponse对象。会自动管理内容协调。设置正确的响应渲染。

      c、任何的API报错都会被抓去协调到合适的响应里面

      d、即将到来的请求将会被认证,验证权限,在运行到dispatch方法处理请求之前

    使用APIView跟正常的View类很相似,即将到来的请求会被派遣到合适的处理函数方法上,比如.get()或者.post()。额外地,还有很多的属性可以被设置在类上控制API政策的不同方面。

    APIView属于很基础的封装高级视图类了,所以这边也就简单粗暴的贴上官方的文档里面的示例。

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework import authentication, permissions
    from django.contrib.auth.models import User
    
    class ListUsers(APIView):
        """
        查看系统里面所有的用户
    
        * 需要token验证
        * 只有admin用户可以访问此视图
        """
        authentication_classes = (authentication.TokenAuthentication,)
        permission_classes = (permissions.IsAdminUser,)
    
        def get(self, request, format=None):
            """
            返回用户列表
            """
            usernames = [user.username for user in User.objects.all()]
            return Response(usernames)

    APIView里面有很多方法,但是个人觉得没什么很重要的,这里就都忽略了,不重要。下面简单列一下,有用的标红。

    属性:

    .renderer_classes
    .parse_classes
    .authentication_classes
    .throttle_classes
    .permission_classes
    .content_negotiation_class

    方法:

    .get_renderers(self)
    .get_parsers(self)
    .get_authenticators(self)
    .get_throttles(self)
    .get_permissions(self)
    .get_content_negotiator(self)
    .get_exception_handler(self)

    下面的方法在dispatching处理方法之前被调用

    .check_permissions(self.request)
    .check_throttles(self.request)
    .perform_content_negotiation(self, request, force=False)

    Dispatch方法

    用来分配.get(), .post(), .post(), patch()和.delete()方法上。

    4、Function Based Views

    rest framework作为一个功能强大的面向资源的框架,对于资源的处理,当然不可能限制于CBV,FBV下面也是可以用的,只是在真正的做生产的时候你才会发现,CBV写起来有多方便,有多爽。

    @api_view()

    @api_view(http_method_names=['GET'])

    如上面的小标题,此函数是一个装饰器函数,看个简单的示例,需要自己手动返回数据

    from rest_framework.decorators import api_view
    
    @api_view()
    def hello_world(request):
        return Response({"message": "Hello, world!"})

    这个view会使用默认的渲染,解析,认证类,除非你在设置里面特殊标记了。

    正常情况下,get方法会被接受,其他方法会抛出"405 Method Not Allowed",为了防止,需要特别标明哪些方法此视图允许

    @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 policy decorators

    用来重写默认的设置,rest framework提供了一系列可以添加到视图上的装饰器,但是这些装饰器必须在@api_view装饰器之后。比如,现在做一个示例,对视图进行节流,保证它对于特殊的用户,每天只能被调用一次。使用@throttle_class装饰器

    from rest_framework.decorators import api_view, throttle_classes
    from rest_framework.throttling import UserRateThrottle
    
    class OncePerDayUserThrottle(UserRateThrottle):
            rate = '1/day'
    
    @api_view(['GET'])
    @throttle_classes([OncePerDayUserThrottle])  # 定义在@api_view之后
    def view(request):
        return Response({"message": "Hello for today! See you tomorrow!"})

    这些装饰器对应的属性设定在APIView的基类里,可以用的装饰器:

    @render_classes()
    @parser_classes()
    @authentication_classes()
    @throttle_classes()
    @permission_classes()

    View schema decorator

    重写FBV的默认架构生成, 你可能需要用到@schema装饰器,也需要写在@api_view装饰器后面

    from rest_framework.decorators import api_view, schema
    from rest_framework.schemas import AutoSchema
    
    class CustomAutoSchema(AutoSchema):
        def get_link(self, path, method, base_url):
            # override view introspection here...
    
    @api_view(['GET'])
    @schema(CustomAutoSchema())
    def view(request):
        return Response({"message": "Hello for today! See you tomorrow!"})

    这个装饰器需要一个AutoSchema实例、一个AutoSchema子类实例或MachemalSchema实例在Schemas文档中如上所描述的。你可以传递None为了将视图排除在架构生成之外

    @api_view(['GET'])
    @schema(None)
    def view(request):
        return Response({"message": "Will not appear in schema!"})
  • 相关阅读:
    [Oracle工程师手记]Linux环境中,反复调用SQLPLUS 执行SQL语句的例子
    [Oracle工程师手记] 记一次 transport lag 的解析
    [Oracle工程师手记] V$ARCHIVE_GAP中的 GAP 何时产生?
    [Oracle 工程师手记] nologging 操作的优先级
    [Oracle 工程师手记] ORA-16642: DB_UNIQUE_NAME mismatch 的解决过程
    [Oracle 工程师手记] 如何构造数据库的 log on trigger
    Groovy调用MD5加密
    Jenkins Pipeline调用 httpRequest插件提交Http请求
    Python调用Jenkins接口批准/拒绝Pipeline流程
    Access 的top和order by 的问题
  • 原文地址:https://www.cnblogs.com/wuzdandz/p/9609519.html
Copyright © 2020-2023  润新知