之前按照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!"})

Django REST Framework API Guide 01的更多相关文章

  1. Django REST Framework API Guide 03

    本节大纲 1.Routers 2.Parsers 3.Renderers Routers Usage from rest_framework import routers router = route ...

  2. Django REST Framework API Guide 08

    1.Filtering 2.Pagination FIltering GenericAPIView的子类筛选queryset的简单方法是重写.get_quueryset()方法. 1.根据当前用户进行 ...

  3. Django REST Framework API Guide 06

    本节大纲 1.Validators 2.Authentication Validators 在REST框架中处理验证的大多数时间,您将仅仅依赖于缺省字段验证,或在序列化器或字段类上编写显式验证方法.但 ...

  4. Django REST Framework API Guide 04

    本节大纲 1.serializers 1.Serializers Serializers允许复杂的数据,像queryset和模型实例转换成源生的Python数据类型.从而可以更简单的被渲染成JSON, ...

  5. Django REST Framework API Guide 02

    本节大纲 1.Generic Views 2.ViewSets  1.Generic Views CBV的主要的一个优点就是极大的允许了对于代码的从用.自然,rest framework取其优势,提供 ...

  6. Django REST Framework API Guide 07

    本节大纲 1.Permissions 2.Throttling Permissions 权限是用来授权或者拒绝用户访问API的不同部分的不同的类的.基础的权限划分 1.IsAuthenticated ...

  7. Django REST Framework API Guide 05

    本节大纲 1.Serializer fields 2.Serializer relations Serializer fields 1.serializer 字段定义在fields.py文件内 2.导 ...

  8. Django Rest Framework API指南

    Django Rest Framework API指南 Django Rest Framework 所有API如下: Request 请求 Response 响应 View 视图 Generic vi ...

  9. tastypie Django REST framework API [Hello JSON]

    tastypie is a good thing. Haven't test it thoroughly. Gonna need some provement. Now I will introduc ...

随机推荐

  1. SpringBoot+Shiro+Redis共享Session入门小栗子

    在单机版的Springboot+Shiro的基础上,这次实现共享Session. 这里没有自己写RedisManager.SessionDAO.用的 crazycake 写的开源插件 pom.xml ...

  2. JS中的toString方法

    JS中的所有对象都具有toString方法,它把一个变量隐式转换为字符串 Number类型的对象的toString()方法比较特殊,有默认模式和基模式两种 默认模式: 无论我们用什么表示法声明数字变量 ...

  3. 高级组件——文件选择器JFileChooser

    1.创建文件选择器 JFileChooser 2.设置选择模式 setFileSelectionMode(int mode) JFileChooser.FILES_ONLY 只能选择文件(默认) JF ...

  4. cmd解压压缩包

    需要安装有winrar start winrar x C:\Users\systme\Desktop\xxx.rar c:\123

  5. day08-(xml&&tomcat)

    回顾: jdbc: java语言操作数据库 jdbc是一套规范,oracle公司制定的 驱动:jdbc的实现类,由数据库厂商提供 使用步骤: .导入jar包(驱动) .注册驱动 Class.forNa ...

  6. python自动化开发-[第十一天]-Mysql

    今日概要: 1.初识mysql 2.MySQL的增删改查 3.主键.外键 4.组合和分组 一.数据库的由来 1.什么是数据库? 数据的仓库,在ATM,购物车中存储数据为目录,称为数据库 1.数据以表格 ...

  7. java io系列10之 FilterInputStream

    FilterInputStream 介绍 FilterInputStream 的作用是用来“封装其它的输入流,并为它们提供额外的功能”.它的常用的子类有BufferedInputStream和Data ...

  8. HTTP深入理解

    HTTP被设计于二十世纪九十年代初期,是一种可扩展的协议, 它是应用层的协议, 通过TCP,或TLS加密的TCP连接来发送, 理论上任何可靠的传输协议都可以使用. 因其良好的扩展性,时至今日,它不仅被 ...

  9. vue this.$router.push和this.$route.path的区别

    this.$router 实际上就是全局路由对象任何页面都可以调用 push(), go()等方法: this.$route  表示当前正在用于跳转的路由器对象,可以调用其name.path.quer ...

  10. 3.Zuul-过滤器

    1.什么是Zuul? 路由+过滤器=Zuul,核心是一系列的过滤器 2.Zuul的过滤器: pre:可以在请求被路由之前调用 route:在路由请求时候被调用 post:在route和error过滤器 ...