django_rest framework 接口开发(一)
1 restful 规范(建议)
基于FbV
def order(request):
if request.method=="GET":
return HttpResponse('得到订单')
if request.method=="POST":
return HttpResponse('提交订单')
if request.method=="PUT":
return HttpResponse('更改订单')
if request.method=="DELETE":
return HttpResponse('删除订单')
基于CBV()
class order(View):
def get(self,request,*args,**kwargs):
return HttpResponse('得到订单')
def post(self,request,*args,**kwargs):
return HttpResponse('提交订单')
def put(self,request,*args,**kwargs):
return HttpResponse('更改订单')
def delete(self,request,*args,**kwargs):
return HttpResponse('删除订单')
域名:
HTTPS 如果用子域名方式(需要解决跨域问题)
版本
过滤 a.cbv,
继承APIVIew
会执行dispatch()
1,在里面的代码段
[ request = self.initialize_request(request, *args, **kwargs)]#这句代码对原生requesst进行加工(丰富了一些功能)
在
# 1 initialize_request里面有值
# 2 authenticators=self.get_authenticators(), 获取实例
# 3 return [auth() for auth in self.authentication_classes] #返回self.authentication_classes 对象实体类
## 获取原生 request 为 request._request
## 获取认证类的对象 request.authenticators def _authenticate(self):#(源码解析) # 循环认证类的所有对象
for authenticator in self.authenticators:
try:
# 执行认证类authenticate方法
# 1 如果authenticate方法抛出异常,self._not_authenticated()执行
# 2 有返回值,必须是元组:(request.user,request.auth)
# 3 返回None,不管,下一个认证来处理
user_auth_tuple = authenticator.authenticate(self)
except exceptions.APIException:
self._not_authenticated()
raise if user_auth_tuple is not None:
self._authenticator = authenticator
self.user, self.auth = user_auth_tuple
return self._not_authenticated() # 如果都没有,就异常 内置认证类
1 认证类,必须继承BaseAuthentication
返回值:
1 None:下一认证来执行,
没有就报异常
2 异常:没有通过认证
3 (元素1,元素2) # 元素1赋值给request.user;元素2赋值给request.auth
2 其他认证类:BasicAuthentication
3 使用:
1 局部使用:
配置authentication_classes=[x,]
2 全局使用:
配置文件
内置权限类
1 权限类,必须继承BasePermission
返回值:
1 True:有权访问
2 False:无权访问
2 使用:
1 局部使用:
配置permission_classes=[x,]
2 全局使用:
配置文件 梳理:
认证,权限,频率
版本:
通过url_get传参(推荐URL传参)
需要控制
1 传递版本参数
2 默认版本
3 允许版本
解析器
本质:
请求头,
状态码
请求方法
parser_classes = [,]
1 请求头要求
Content-Type:xxx/xxx
2 数据格式要求
name=xx&age=xx
1 form 表单提交
自带请求头
# 内部自动转化 name=xx&age=xx 2 ajax 提交
情况一:
$.ajax({
url:...,
type:POST,
headers:{'Content-Type':'application/json'},
data:{name:xxx,age:xxx}
})
# 内部自动转化 name=xx&age=xx
# body有值, POST无
情况二:
$.ajax({
url:...,
type:POST,
headers:{'Content-Type':'application/json'},
data:JSON.stringfy({name:xxx,age:xxx})
})
# 内部自动转化 name=xx&age=xx
# body有值, POST无
3 rest_framework 解析器,对请求体数据进行解析
1 获取用户请求
2 获取用户请求体
3 根据用户请求体,交给parser_chlaaes去处理 "DEFAULT_PARSER_CLASSES":['rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser']
序列化: 1. 写类
class RolesSerializer(serializers.Serializer):
id = serializers.IntegerField()
title = serializers.CharField() class UserInfoSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserInfo
# fields = "__all__"
fields = ['id','username','password',] 2. 字段
a. title = serializers.CharField(source="xxx.xxx.xx.xx")
b. title = serializers.SerializerMethodField()
class UserInfoSerializer(serializers.ModelSerializer):
rls = serializers.SerializerMethodField() # 自定义显示 class Meta:
model = models.UserInfo
fields = ['id','username','password','rls',] # 自定义方法
def get_rls(self, row):
role_obj_list = row.roles.all() ret = []
for item in role_obj_list:
ret.append({'id':item.id,'title':item.title})
return ret
c. 自定义类 3. 自动序列化连表
class UserInfoSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserInfo
# fields = "__all__"
fields = ['id','username','password','group','roles']
depth = 1 # 0 ~ 10 4. 生成链接
class UserInfoSerializer(serializers.ModelSerializer):
group = serializers.HyperlinkedIdentityField(view_name='gp',lookup_field='group_id',lookup_url_kwarg='xxx')
class Meta:
model = models.UserInfo
# fields = "__all__"
fields = ['id','username','password','group','roles']
depth = 0 # 0 ~ 10 class UserInfoView(APIView):
def get(self,request,*args,**kwargs): users = models.UserInfo.objects.all() ser = UserInfoSerializer(instance=users,many=True,context={'request': request})
ret = json.dumps(ser.data, ensure_ascii=False)
return HttpResponse(ret) 源码:
对象, Serializer类处理;
QuerySet,ListSerializer类处理;
# ser.data 请求数据校验: class XXValidator(object):
def __init__(self, base):
self.base = base def __call__(self, value):
if not value.startswith(self.base):
message = '标题必须以 %s 为开头。' % self.base
raise serializers.ValidationError(message) def set_context(self, serializer_field):
"""
This hook is called by the serializer instance,
prior to the validation call being made.
"""
# 执行验证之前调用,serializer_fields是当前字段对象
pass class UserGroupSerializer(serializers.Serializer):
title = serializers.CharField(error_messages={'required':'标题不能为空'},validators=[XXValidator('老男人'),]) class UserGroupView(APIView): def post(self,request,*args,**kwargs): ser = UserGroupSerializer(data=request.data)
if ser.is_valid():
print(ser.validated_data['title'])
else:
print(ser.errors) return HttpResponse('提交数据') class XXValidator(object):
def __init__(self, base):
self.base = base def __call__(self, value):
if not value.startswith(self.base):
message = '标题必须以 %s 为开头。' % self.base
raise serializers.ValidationError(message) def set_context(self, serializer_field):
"""
This hook is called by the serializer instance,
prior to the validation call being made.
"""
# 执行验证之前调用,serializer_fields是当前字段对象
pass class UserGroupSerializer(serializers.Serializer):
title = serializers.CharField(error_messages={'required':'标题不能为空'},validators=[XXValidator('老男人'),]) class UserGroupView(APIView): def post(self,request,*args,**kwargs): ser = UserGroupSerializer(data=request.data)
if ser.is_valid():
print(ser.validated_data['title'])
else:
print(ser.errors) return HttpResponse('提交数据') #未完成: 自定义验证规则时,需要钩子函数?请问钩子函数如何写?
django_rest framework 接口开发(一)的更多相关文章
- django_rest framework 接口开发(二)
1 a. 认证 - 仅使用: from django.views import View from rest_framework.views import APIView from rest_fram ...
- 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_04-新增页面-服务端-接口开发
api接口定义方法 api的微服务里面.CmsPageControllerApi内定义add方法,返回类型是CmsPageResult CmsPageResult继承了ResponseResult R ...
- 《连载 | 物联网框架ServerSuperIO教程》- 13.自定义视图显示接口开发,满足不同的显示需求
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《Python Web 接口开发与测试》---即将出版
为什么要出这样一本书? 首先,今年我有不少工作是跟接口自动化相关的,工作中的接口自动化颇有成效. 我一直是一个没有测试大格局的人,在各种移动测试技术爆发的这一年,我却默默耕耘着自己的一亩三分地儿(We ...
- Entity Framework 6 开发系列 目录
2014 年开始接触 Entity Framework 6 也快两年,用它已经沉淀了一个成熟架构,也用来开发了不少大大小小的产品和项目,直到这段时间,才真正有时间来回顾,重新学习它,为让大家更加了解E ...
- 浅谈 PHP 与手机 APP 开发(API 接口开发) -- 转载
转载自:http://www.thinkphp.cn/topic/5023.html 这个帖子写给不太了解PHP与API开发的人 一.先简单回答两个问题: 1.PHP 可以开发客户端? 答:不可以,因 ...
- 支付宝WAP支付接口开发(Node/Coffee语言)
此博客不更新很久了, 更新的文档在这, 有兴趣到这里围观: http://neutra.github.io/2013/%E6%94%AF%E4%BB%98%E5%AE%9DWAP%E6%94%AF%E ...
- C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取
一.前言 当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,需要用户进行复杂的操作才可以和网站绑定,或者很多公司直接不绑定,而是每次都让用户填写账号 ...
- C#.NET微信公众账号接口开发系列文章整理--微信接口开发目录,方便需要的博友查询
前言: 涉及微信接口开发比较早也做的挺多的,有时间的时候整理了开发过程中一些思路案例,供刚学习微信开发的朋友参考.其实微信接口开发还是比较简单的,但是由于调试比较麻烦,加上微信偶尔也会给开发者挖坑,并 ...
随机推荐
- 定时备份删除数据库sql
1.备份数据库 mkdir -p /home/mysql/mysql_bak/ vi mysql_bak.sh #!/bin/bash #Shell Command For Backup MySQL ...
- Django:将后台返回的数据填充到select下拉框中
select选择框如下: <select data-placeholder="选择项目..." class="form-control" name=&qu ...
- 基于TreeSoft实现异构数据同步
一.为了解决数据同步汇聚,数据分发,数据转换,数据维护等需求,TreeSoft将复杂的网状的同步链路变成了星型数据链路. TreeSoft作为中间传输载体负责连接各种数据源,为各种异构数据库之 ...
- consul(一)什么是consul
1. consul的基本介绍 在分布式架构中,服务治理是一个重要的问题.在没有服务治理的分布式集群中,各个服务之间通过手工或者配置的方式进行服务关系管理,遇到服务关系变化或者增加服务的时候,人肉配置极 ...
- linux系统 重启盘符错乱问题
linux磁盘重启乱序问题处理 最近到客户那去巡检时,客户提到一个问题,他们的rac在重启的时候,原来的sda1.sdb1.sdc1会对应变成sdd1.sde1.sdf1,由于他们使用的是盘符来绑定裸 ...
- RabbitMQ官方教程二 Work Queues(GOLANG语言实现)
RabbitMQ官方教程二 Work Queues(GOLANG语言实现) 在第一个教程中,我们编写了程序来发送和接收来自命名队列的消息. 在这一部分中,我们将创建一个工作队列,该队列将用于在多个wo ...
- 3.wxml特性之数据绑定
WXML----显示 {{变量名}} JS----------变量名:”变量值” 所有属性和组件都必须小写
- python 线程队列LifoQueue-LIFO(36)
在 python线程队列Queue-FIFO 文章中已经介绍了 先进先出队列Queue,而今天给大家介绍的是第二种:线程队列LifoQueue-LIFO,数据先进后出类型,两者有什么区别呢? 一.队 ...
- [转帖]年经贴: ARM将为苹果开发高性能CPU核心 取代笔记本x86处理器?
ARM将为苹果开发高性能CPU核心 取代笔记本x86处理器? https://www.cnbeta.com/articles/tech/899421.htm . 之前苹果的哥们说过 谁特别在意自己的软 ...
- 请求部署在 IIS7.5 上的 REST 服务的 Put/Post/Delete 操作发生 HTTP Error 405.0 - Method Not Allowed 错误之解决
背景 请求部署在 IIS7.5 上的 REST 服务的 Put/POST/DELETE 操作发生 HTTP Error 405.0 - Method Not Allowed 错误. Issue 解决 ...