Django REST Framework API Guide 01

时间:2022-09-01 09:49:20

之前按照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. MySQL数据库相关命令

    1.命令:show create table 表名 功能:获取建表语句 2.命令:desc 表名 功能:展示表字段及其类型

  2. Area

    http://poj.org/problem?id=1265 #include<cstdio> #include<istream> #include<algorithm& ...

  3. jQuery&period;each&lpar;&rpar; 的5个案例

    1.基本的jQuery.each实例 看看 each() 函数是如何处理一个 jQuery 对象的.首先选取所有的a标签 并且打印出他们的href属性. 需要注意的是, 在 each() 当中使用 j ...

  4. 解决set &sol;p yn&equals; 接受键盘输入导致ECHO 处于关闭状态的问题

    今天写了一个自动更新程序的批处理脚本,但是有个变量一直赋值有问题.弄了一个下午终于找到原因及解决方法: ----转载要说明来自:博客园--邦邦酱好 哦 有问题的代码如下: @echo off echo ...

  5. CentOS 安装Docker

    CentOS 系列安装 Docker Docker 支持 CentOS6 及以后的版本. CentOS6 对于 CentOS6,可以使用 EPEL 库安装 Docker,命令如下 $ sudo yum ...

  6. Captcha服务(后续2)— 改造Captcha服务之Asp&period;Net Core项目中如何集成TypeScript

    环境准备 .Net Core 版本:下载安装.Net Core SDK,安装完成之后查看sdk版本 ,查看命令dotnet --version,我的版本是2.2.101 IDE: Visual Stu ...

  7. Linux实战教学笔记50:Zabbix监控平台3&period;2&period;4(二)深入理解zabbix

    https://www.cnblogs.com/chensiqiqi/p/9162986.html 一,Zabbix Web操作深入 1.1 Zabbix Web下的主机和模版以及监控项的添加方式 ( ...

  8. IntelliJ IDEA配置Tomcat 与安装Tomcat失败原因

    1.jdk中jre损坏,无法提供运行环境:重新下载jre安装并配置

  9. Python编程笔记(第二篇)二进制、字符编码、数据类型

    一.二进制 bin() 在python中可以用bin()内置函数获取一个十进制的数的二进制 计算机容量单位 8bit = 1 bytes 字节,最小的存储单位,1bytes缩写为1B 1KB = 10 ...

  10. Hadoop源码阅读-HDFS-day1

    HDFS声明及构造函数 @InterfaceAudience.Private @InterfaceStability.Evolving public class Hdfs extends Abstra ...