接口、RESTful规范、DRF
接口
#接口:url连接,通过向链接发送不同的类型请求与参数得到相应的响应数据
#1.在视图书写处理请求的 视图函数
#2.在路由层为视图函数配置 url链接=>产生接口
#3.前台通过ajax,爬虫,工具等对接口发送请求,提交相应的参数获得对应的响应数据
# https://api.map.baidu.com/place/v2/search
'''
ak: 6E823f587c95f0148c19993539b99295
region: 上海
query: 肯德基
output: json
'''
RESTful规范
#定义接口的规范
# REST:表征性状态转移(Representational State Transfer)
#RESTful规范:web数据请求接口设计规范 #学习的目的:
#1.如何设计url链接地址
#2.如何设计响应的数据格式 '''
1)通常使用https请求
2)域名:有api关键字出现
-- https://api.baidu.com (可能涉及跨越问题)
-- https://baidu.com/api
3)版本:不同版本需要标注
-- https://example.com/api/v1 | -- https://example.com/api/1
-- https://example.com/api/v2 | -- https://example.com/api/2
4)资源:请求的目标数据称之为资源,资源一般都用名词复数表示
-- https://example.com/api/v1/books (之前不规范的案例: /get_books/)
5)操作方式:不从请求链接体现操作方式,从请求方式上决定操作方式
-- get:https://example.com/api/v1/books 获取所有
-- post:https://example.com/api/v1/books 新增一本
-- put:https://example.com/api/v1/book/1 更新id=1的一本
-- patch:https://example.com/api/v1/book/1 更新id=1的一本
-- delete:https://example.com/api/v1/book/1 删除id=1的一本
6)资源过滤:通过接口传递参数来过滤资源
-- https://example.com/api/v1/books?limit=10 限制10条 7)状态码:返回数据要标准状态码,通过在数据中 {"status": 0}
-- SUCCESS("0", "查询成功")
-- NODATA("1xx", "非正确,无数据,显示基本信息")
-- FEAILED("2xx", "查询失败")
8)错误信息:请求失败需要标注错误信息 {"msg": "请求参数不合法"}
9)操作结果:请求操作成功的返回结果 {"results": []}
-- get:返回资源列表 | 返回单一资源
-- post:返回单一新增资源
-- put:返回更新的资源
-- patch:返回更新的资源
-- delete:返回空文档
10)子资源返回资源接口:返回的资源如果有子资源,返回子资源的链接地址,如查找书,书的封面图片就可以url表示
'''
restful规范面试总结
'''
1.url链接设计:采用https方式,有api关键字,有版本需要明确版本,请求链接用名词来表示资源,具体的操作方式采用请求方式来确定
2.url响应数据设计:需要明确状态码、错误信息、成功结果,子资源一般用子资源的接口来标注
'''
原生简易书写TESTful规范接口
#路由层
from app import views urlpatterns = [
url(r'^books/', views.books),
]
#视图层
from django.http import JsonResponse
book_list = [
{
'id': 1,
'name': '三国演义'
},
{
'id': 2,
'name': '水浒传'
}
] def books(request):
if request.method == 'GET':
ak = request.GET.get('ak', None)
if not ak:
return JsonResponse({
'status': 101,
'message': '没有明确ak',
}, json_dumps_params={'ensure_ascii': False})
return JsonResponse({
'status': 0,
'message': 'ok',
'results': book_list
}, json_dumps_params={'ensure_ascii': False})
if request.method == 'POST':
# return HttpResponse('post back')
name = request.POST.get('name')
id = len(book_list) + 1
book = {'id': id, 'name': name}
book_list.append(book)
return JsonResponse({
'status': 0,
'message': 'ok',
'results': book
}, json_dumps_params={'ensure_ascii': False})
CBV流程
'''
1)as_view()
--User.as_view()本质拿到view(request,*args,**kwargs)函数对象
2)view(request,*args,**kwargs)
--return self.dispatch(request,*args,**kwargs)来完成请求的反射
3)dispatch(request,*args,**kwargs)
--完成具体的请求响应的分发
#注:重写dispatch事可以再分发响应时,加入其他逻辑限制
'''
#路由层
urlpatterns = [
url(r'users/', views.Users.as_view())
] #视图层
from django.views import View class Users(View):
def dispatch(self, request, *args, **kwargs):
pass # 可以对请求加以限制
result = super(Users, self).dispatch(request, *args, **kwargs)
pass # 可以对请求再近一步处理
return result def get(self, request, *args, **kwargs):
return JsonResponse({
'message': 'get message'
}) def post(self, request, *args, **kwargs):
return JsonResponse({
'message': 'post message'
})
drf安装
# drf:djangorestfraework => pip3 install djangorestfraework from rest_framework.views import APIView
from rest_framework.request import Request
from rest_framework.response import Response
drf的安装步骤
# 1)安装drf:pip3 install djangorestfraework
# 2)settings.py 注册app:INSTALLED_APPS = [..., 'rest_framework']
# 3)基于cbv完成满足RESTful规范的接口
drf具体使用
#路由层
from app import views urlpatterns = [
url(r'teachers/', views.Teachers.as_view())
]
#视图层
from rest_framework.views import APIView
from rest_framework.response import Response class Teachers(APIView):
def get(self, request, *args, **kwargs):
# return JsonResponse({
# 'status': 2,
# 'message': '请求成功'
# }, json_dumps_params={'ensure_ascii': False})
salary = request.GET.get('salary')
print(salary)
return Response({
'status': 2,
'message': 'get请求成功'
})
# 前台发送数据的方式:formdata|urlencoded|json
#drf的request都对其二次封装解析到request.data中
def post(self, request, *args, **kwargs):
print(request)
print(request._request)
salary = request.data.get('salary')
print(salary)
return Response({
'status': 2,
'message': 'post请求成功'
})
drf的请求源码分析
# as_view()
# 核心走了父类as_view
view = super(APIView, cls).as_view(**initkwargs)
# 返回的是局部禁用csrf认证的view视图函数
return csrf_exempt(view) # dispatch(self, request, *args, **kwargs)
# 二次封装request对象
request = self.initialize_request(request, *args, **kwargs)
# 自定义request规则
self.initial(request, *args, **kwargs) # initialize_request(self, request, *args, **kwargs)
# 原生request封装在request._request # initial(self, request, *args, **kwargs)
# 认证
self.perform_authentication(request)
# 权限
self.check_permissions(request)
# 频率
self.check_throttles(request) # 在drf的request.py的模块中,对django的request进行二次封装
def __getattr__(self, attr):
try:
return getattr(self._request, attr)
except AttributeError:
return self.__getattribute__(attr)
# 完成对django的request完全兼容
drf序列化
#models.py
class Students(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
gender = models.CharField(max_length=8) def __str__(self):
return self.name
#自定义序列化类:为具体的类提供序列化
#my_serializers.py
from rest_framework import serializers
class StudentSerializers(serializers.Serializer)
#1.如果没有source引入models的字段名,序列化字段名必须同models的字段名
#2.如果有source引入models的字段名,序列化字段名必须不同于models的字段名,目的是对外隐藏数据库的字段名
id = serializers.IntegerField()
student_name = serializers.CharField(source='name')
age = serializers.IntegerField()
gender = serializers.CharField()
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from app import models
from app.my_serializers import StudentSerializers class Students(APIView):
def get(self, request, *args, **kwargs):
student_list = models.Students.objects.all()
# 需要序列化多个对象,需要明确many=True
student_list = StudentSerializers(student_list, many=True)
return Response({
'status': 0,
'message': 'ok',
'results': student_list.data
}) def post(self, request, *args, **kwargs):
name = request.data.get('name')
age = request.data.get('age')
gender = request.data.get('gender')
student = models.Students.objects.create(name=name, age=age, gender=gender)
student = StudentSerializers(student)
return Response({
'status': 0,
'message': 'ok',
'results': student.data
})
#urls.py
urlpatterns = [
url(r'students/', views.Students.as_view()),
]
接口、RESTful规范、DRF的更多相关文章
- day71:drf:API接口&Restful API规范&Django Rest Framework&drf中的序列化和反序列化功能
目录 1.web应用模式 2.API接口 3.Restful API规范 4.序列化 5.Django Rest Framework 1.drf的简单介绍 2.drf的特点 3.如何安装drf 4.d ...
- Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)
一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...
- DRF cbv源码分析 restful规范10条 drf:APIView的源码 Request的源码 postman的安装和使用
CBV 执行流程 路由配置:url(r'^test/',views.Test.as_view()), --> 根据路由匹配,一旦成功,会执行后面函数(request) --> 本质就是执 ...
- DRF之restful规范、Postman接口测试
一. DRF简介 Django REST框架是一个功能强大且灵活的工具包,用于构建Web API. 使用REST框架的一些原因: 该网站可浏览API是你的开发人员一个巨大的可用性胜利. 身份验证策略包 ...
- 一、restful规范 二、CBV(View)源代码执行流程 三、drf框架安装和简单使用
一.restful规范 ''' 它是一个规范,面向资源架构 十条规范 1.API与用户的通讯协议,总是使用HTTPs协议,确保了网络传输的安全性 2.域名 --https://api.example. ...
- RESTful规范与django编写restful接口
一.什么是RESTful规范 ①REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” ②REST从资 ...
- 01 drf源码剖析之restful规范
01 restful规范 目录 01 restful规范 1. 什么是restful规范 2.restful规范详细 1. 什么是restful规范 restful是一套规则,是程序间进行数据传输的一 ...
- 微服务接口设计(RESTful规范)
微服务的接口设计(RESTful规范) 基本知识 URI:在RESTful架构中,每个URI代表一种资源 URI规范: 不用大写 用中杠-,不用下划线_ 路径中不能有动词,只能有名词 名词表示资源集合 ...
- DjangoRestFramework 学习之restful规范 APIview 解析器组件 Postman等
DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析器组件 ...
随机推荐
- python爬虫以及后端开发--实用加密模板整理
都是作者累积的,且看其珍惜,大家可以尽量可以保存一下,如果转载请写好出处https://www.cnblogs.com/pythonywy 一.md5加密 1.简介 这是一种使用非常广泛的加密方式,不 ...
- hook框架-frida简单使用模板以及frida相关接口
一目录结构 ├── test.py #py脚本 └── test.js #js脚本 一.py脚本 test.py import frida import sys #连接设备app dev=frida. ...
- ucore学习
1.启动操作系统的bootloader,用于了解操作系统启动前的状态和要做的准备工作,了解运行操作系统的硬件支持,操作系统如何加载到内存中,理解两类中断--"外设中断"," ...
- SpringBoot项目 使用Jenkins进行自动化部署 gitlab打tag 生产测试环境使用 含配置中心
脚本 node('master') { def mvnHome = tool 'maven11-free' def gitUrl = "http://gitlab.wdcloud.cc:10 ...
- python numpy常用的数学和统计函数
numpy模块的核心就是基于数组的运算,相比于列表和其他数据结构,数组的运算效率是最高的.在统计分析和挖掘过程中,经常会使用到numpy模块的函数,以下是常用的数学函数和统计函数: 常数p就是圆周率 ...
- MacOS上的效率设置--Windows转移过来的小白设置
1 Copy Path Mac上面的文件管理并不像Windows那么的直观,经常需要指定文件路径时,总是去右键-简介获取相当的费劲.Mac之所以称之为生产力工具,优势就在于此了.利用自动操作的功能就能 ...
- 欢迎来到 C# 9.0(Welcome to C# 9.0)【纯手工翻译】
翻译自 Mads Torgersen 2020年5月20日的博文<Welcome to C# 9.0>,Mads Torgersen 是微软 C# 语言的首席设计师,也是微软 .NET 团 ...
- 获取访问的ip地址
最近有一个这样的需求:{ 内网没有访问互联网的权限(没网) 内网:访问链接地址,跳转http://www.123.com 外网:访问链接地址,跳转http;//www.456.com } 在网上看到一 ...
- 高可用集群之corosync+pacemaker
1.概念 在传统Linux集群种类,主要分了三类,一类是LB集群,这类集群主要作用是对用户的流量做负载均衡,让其后端每个server都能均衡的处理一部分请求:这类集群有一个特点就是前端调度器通常是单点 ...
- 记录一次mybatis缓存和事务传播行为导致ut挂的排查过程
起因 rhea项目有两个ut一直都是挂的,之前也经过几个同事排查过,但是都没有找到解决办法,慢慢的这个问题就搁置了.因为之前负责rhea项目的同事离职,我临时接手了这个项目,刚好最近来了一个新同事在做 ...