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!"})
Django REST Framework API Guide 01的更多相关文章
- Django REST Framework API Guide 03
本节大纲 1.Routers 2.Parsers 3.Renderers Routers Usage from rest_framework import routers router = route ...
- Django REST Framework API Guide 08
1.Filtering 2.Pagination FIltering GenericAPIView的子类筛选queryset的简单方法是重写.get_quueryset()方法. 1.根据当前用户进行 ...
- Django REST Framework API Guide 06
本节大纲 1.Validators 2.Authentication Validators 在REST框架中处理验证的大多数时间,您将仅仅依赖于缺省字段验证,或在序列化器或字段类上编写显式验证方法.但 ...
- Django REST Framework API Guide 04
本节大纲 1.serializers 1.Serializers Serializers允许复杂的数据,像queryset和模型实例转换成源生的Python数据类型.从而可以更简单的被渲染成JSON, ...
- Django REST Framework API Guide 02
本节大纲 1.Generic Views 2.ViewSets 1.Generic Views CBV的主要的一个优点就是极大的允许了对于代码的从用.自然,rest framework取其优势,提供 ...
- Django REST Framework API Guide 07
本节大纲 1.Permissions 2.Throttling Permissions 权限是用来授权或者拒绝用户访问API的不同部分的不同的类的.基础的权限划分 1.IsAuthenticated ...
- Django REST Framework API Guide 05
本节大纲 1.Serializer fields 2.Serializer relations Serializer fields 1.serializer 字段定义在fields.py文件内 2.导 ...
- Django Rest Framework API指南
Django Rest Framework API指南 Django Rest Framework 所有API如下: Request 请求 Response 响应 View 视图 Generic vi ...
- 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 ...
随机推荐
- 震撼:多线程下的操作离不开synchronized
昨天在写一个聊天程序,在发送消息的时候是采用单独的一个线程,接收消息是在另一个线程中完成. 我在测试的过程中发现,有的时候当消息比较多时,比如: 当我刚刚发送完一条消息,这个时候要将我发送的消息添加到 ...
- Tomcat源码组织结构
Tomcat 源码组织结构 目录结构 这里所介绍的目录结构,是使用CATALINA-BASE变量定义的路径,如果没有通过配置多个CATALINA-BASE目录来使用多实例,则CATALINA-BASE ...
- java类文件
一个.java文件中可以有很多类.不过注意以下几点: 1.public 权限的类只能有一个(也可以一个都没有,但最多只有1个) ,其他的类不能加public. 2.这个.java文件的文件名必须是pu ...
- 访问内网(https,udp)
安装teamview 客户端. 安装vpn驱动(这里的VPN应该是A主机与B客户端分别连接上了teamview的服务器,但是本身不是局域 网,所以不能直接访问A的局域网的其他主机) 主机端A,安装主机 ...
- SQL知识以及SQL语句简单实践
综述 大家都知道SQL是结构化查询语言,是关系数据库的标准语言,是一个综合的,功能极强的同时又简洁易学的,它集级数据查询(Data Quest),数据操纵(Data Manipulation),数据定 ...
- JAVA核心技术I---JAVA基础知识(映射Map)
一:映射Map分类 二:Hashtable(同步,慢,数据量小) –K-V对,K和V都不允许为null –同步,多线程安全 –无序的 –适合小数据量 –主要方法:clear, contains/con ...
- VMware 无法打开内核设备 \\.\Global\vmx86
无法打开内核设备 \\.\Global\vmx86: 系统找不到指定的文件.你想要在安装 VMware Workstation 前重启吗? vmware 安装完成后,打开现有虚拟系统时,报错. 无法打 ...
- Redis之主从复制
定义:主机数据更新后根据配置策略,自动同步到备的Master/slave机制,Master以写为主,Slave以读为主. Tip:配从(从库)不配主(主库) 1.从库配置: slave of 主库IP ...
- Hadoop记录-hive merge小文件
1. Map输入合并小文件对应参数:set mapred.max.split.size=256000000; #每个Map最大输入大小set mapred.min.split.size.per.no ...
- Ubuntu 18.04 设置开机启动脚本 rc.local systemd
ubuntu18.04不再使用initd管理系统,改用systemd. ubuntu-18.04不能像ubuntu14一样通过编辑rc.local来设置开机启动脚本,通过下列简单设置后,可以使rc.l ...