Django REST Framework API Guide 01

 

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

 

但愿你们都能坚持,都能努力,支撑住野心的只有如今的行动,不积跬步无以致千里。加油。django

 

内容大纲 api

  一、requestssession

  二、response架构

  三、CBV APIViewapp

  四、FBV @api_view框架

 

 

一、Requests

.dataide

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

.query_paramspost

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

.user

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

.META/.session

这个本身注意一下

.method/.content_type

这种鬼东西,能够忘记了。

 

二、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实例里面添加额外的参数.

 

三、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()方法上。

 

 

四、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!"})
相关文章
相关标签/搜索