2) 接口规范 原生django接口、单查群查 postman工具 CBV源码解析
内容了解
"""
、接口:什么是接口、restful接口规范
、CBV生命周期源码 - 基于restful规范下的CBV接口
、请求组件、解析组件、响应组件
、序列化组件(灵魂)
、三大认证(重中之重):认证、权限(权限六表)、频率
、其他组件:过滤、筛选、排序、分页、路由
"""
# 难点:源码分析
一、接口
1.什么是
接口:联系两个物质的媒介,完成信息交互
web程序中:联系前台页面与后台数据库的媒介
web接口组成:
url:长得像放回数据的url链接
请求参数:前台按照指定的key提供数据给后台
响应数据:后台与数据库交互后将数据反馈给前台
2.restful接口规范
接口规范:就是为了采用不同的后台语言,也能使用同样的接口获取到同样的数据
如何写接口:接口规范是 规范化书写接口的,写接口要写 url、响应数据
注:如果将请求参数也纳入考量范围,那就是在写 接口文档
两大部分:
#1.url
) 用api关键字标识接口url
api.baidu.com | www.baidu.com/api ) 接口数据安全性决定优先选择https协议 ) 如果一个接口有多版本存在,需要在url中标识体现
api.baidu.com/v1/... | api.baidu.com/v2/... ) 接口操作的数据源称之为 资源,在url中一般采用资源复数形式,一个接口可以概括对该资源的多种操作方式,(之前是FBV,一对一,现在CBV,接口针对一个类,类下面有多个方法)
api.baidu.com/books | api.baidu.com/books/(pk) ) 请求方式有多种,用一个url处理如何保证不混乱 - 通过请求方式标识操作资源的方式
/books get 获取所有
/books post 增加一个(多个)
/books/(pk) delete 删除一个
/books/(pk) put 整体更新一个
/books/(pk) patch 局部更新一个 ) 资源往往涉及数据的各种操作方式 - 筛选、排序、限制(查询和西有关的,价格降序,3条)
api.baidu.com/books/?search=西&ordering=-price&limit=
#2.响应数据
) http请求的响应会有响应状态码,接口用来返回操作的资源数据,可以拥有 操作数据结果的 状态码
status (操作资源成功) (操作资源失败) (操作资源成功,但没匹配结果)
注:资源状态码不像http状态码,一般都是后台与前台或是客户约定的 ) 资源的状态码文字提示
status ok '账号有误' '密码有误' '用户锁定' ) 资源本身
results
注:删除资源成功不做任何数据返回(返回空字符串) ) 不能直接返回的资源(子资源、图片、视频等资源),返回该资源的url链接
#3.示例
url:https://api.baidu.com/v1/books?ordering=-price&limit=3
get|post|put|patch|delete
{
'status': 0,
'msg': 'ok',
'results': [
{
'title': '西游记',
'img': 'https://api.baidu.com/media/xyj.png'
}
]
}
二、基于restful规范的原生Django接口
1.创建django项目,app名称为api
2. 主路由 路由分发:url.py
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 路由分发
url(r'^api/', include('api.urls'))
]
3. api组件的子路由:api/url.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^books/', views.Book.as_view()), #群查
url(r'^books/(?P<pk>.*)/$', views.Book.as_view()), #单查
]
4.views
5. 模型层:model.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=64)
price = models.DecimalField(max_digits=5, decimal_places=2)
class Meta:
db_table = 'old_boy_book'
verbose_name = '书籍'
verbose_name_plural = verbose_name
def __str__(self):
return '《%s》' % self.title
6. 后台层 注册:admin.py
from django.contrib import admin
from . import models
admin.site.register(models.Book)
7. 数据库迁移
>: python manage.py makemigrations #数据库迁移
>: python manage.py migrrate
>: python manage.py createsuperuser #创建超级用户,开始admin后台管理
8. 原生django单查群查 完整视图层:views.py
class Book(View):
def get(self, request, *args, **kwargs):
pk = kwagrs.get('pk')
if pk:
# 单查
else:
# 群查
def post(self, request, *args, **kwargs):
# 增
def delete(self, request, *args, **kwargs):
# 删
def put(self, request, *args, **kwargs):
# 整体改
def patch(self, request, *args, **kwargs):
# 局部改
示例
from django.http import JsonResponse
from django.views import View
from . import models
# 六大基础接口:获取一个 获取所有 增加一个 删除一个 整体更新一个 局部更新一个
# 十大接口:群增 群删 整体改群改 局部改群改
class Book(View):
def get(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if not pk: # 群查,子路由中有对应规则,url没有指定pk就是全都要127.0.0.1:8000/api/books/
# 操作数据库
book_obj_list = models.Book.objects.all()
# 序列化过程
book_list = []
for obj in book_obj_list:
dic = {}
dic['title'] = obj.title
dic['price'] = obj.price
book_list.append(dic)
# 响应数据
return JsonResponse({
'status': 0,
'msg': 'ok',
'results': book_list
}, json_dumps_params={'ensure_ascii': False}) //防止转码,不然汉字会转码
else: # 单查,127.0.0.1:8000/api/books/1/ 查看第一个
book_dic = models.Book.objects.filter(pk=pk).values('title', 'price').first()
if book_dic:
return JsonResponse({
'status': 0,
'msg': 'ok',
'results': book_dic
}, json_dumps_params={'ensure_ascii': False})
return JsonResponse({
'status': 2,
'msg': '无结果',
}, json_dumps_params={'ensure_ascii': False})
# postman可以完成不同方式的请求:get | post | put ...
# postman发送数据包有三种方式:form-data | urlencoding | json
# 原生django对urlencoding方式数据兼容最好
def post(self, request, *args, **kwargs):
# 前台通过urlencoding方式提交数据
try:
book_obj = models.Book.objects.create(**request.POST.dict())
if book_obj:
return JsonResponse({
'status': 0,
'msg': 'ok',
'results': {'title': book_obj.title, 'price': book_obj.price}
}, json_dumps_params={'ensure_ascii': False})
except:
return JsonResponse({
'status': 1,
'msg': '参数有误',
}, json_dumps_params={'ensure_ascii': False})
return JsonResponse({
'status': 2,
'msg': '新增失败',
}, json_dumps_params={'ensure_ascii': False})
三、CBV请求生命周期源码回顾 (之前总结过)
1.路由
2. as_view和view
3.dispatch
任务分发其实是调用了我们写的类中的方法,将路由来的参数传递给她们,返回相应数据给前端
4.views.py
四、Postman接口工具
官网下载安装
get请求,携带参数采用Params
post等请求,提交数据包可以采用三种方式:form-date、urlencoding、json
所有请求都可以携带请求头
上方views.py中有后端代码
#百度测试接口 接口文档
method: GET
url: https://api.map.baidu.com/place/v2/search
params:
ak: 6E823f587c95f0148c19993539b99295
region: 上海、郑州、杭州等
query: 肯德基、公园等
output: json
2) 接口规范 原生django接口、单查群查 postman工具 CBV源码解析的更多相关文章
- Django生命周期 URL ----> CBV 源码解析-------------- 及rest_framework APIView 源码流程解析
一.一个请求来到Django 的生命周期 FBV 不讨论 CBV: 请求被代理转发到uwsgi: 开始Django的流程: 首先经过中间件process_request (session等) 然后 ...
- Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)
一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...
- Django框架 之 admin管理工具(源码解析)
浏览目录 单例模式 admin执行流程 admin源码解析 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在 ...
- Django的rest_framework的视图之基于ModelViewSet视图源码解析
前言 今天一直在整理Django的rest_framework的序列化组件,前面一共写了2篇博客,前面的博客给的方案都是一个中间的状态的博客,其中有很多的冗余的代码,如果有朋友不清楚,可以先看下我前面 ...
- Django中CBV源码解析
使用 关于FBV和CBV的使用在之前有提到,点击穿越. 准备 首先在视图中创建一个类并继承 django.views.View 类,在类中可定义各种请求方式对应执行的函数(函数名为请求方式名称小写). ...
- 关于原生js中函数的三种角色和jQuery源码解析
原生js中的函数有三种角色: 分两大种: 1.函数(最主要的角色)2.普通对象(辅助角色):函数也可以像对象一样设置属于本身的私有属性和方法,这些东西和实例或者私有变量没有关系两种角色直接没有必然的关 ...
- Django之CBV源码解析
l链接跳转:https://www.cnblogs.com/hnlmy/p/9662798.html 以及https://www.cnblogs.com/hnlmy/p/10603999.html
- DRF框架(一)——restful接口规范、基于规范下使用原生django接口查询和增加、原生Django CBV请求生命周期源码分析、drf请求生命周期源码分析、请求模块request、渲染模块render
DRF框架 全称:django-rest framework 知识点 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful规范下的CBV接口 3.请求组件 ...
- restful接口规范 | 基于restful的原生django接口
restful接口规范 接口 接口:联系两个物质的媒介,完成信息交互 web程序中:联系前台页面与后台数据库的媒介 web接口组成: - url:长得像返回数据的url链接 - 请求参数:前台按照指定 ...
随机推荐
- MySQL学习之路6-数据表连接方式
内连接 关键字: inner join on 语句:select * from <a_table> inner join <b_table> on a.id = b.id ; ...
- C语言实现链式队列
链式队列,简称"链队列",即使用链表实现的队列存储结构. 链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为 top 和 rear)分别指向链表中队列的队头元素和队尾元素, ...
- mysql 向上取整
SELECT CEILING(10.0) --->10 SELECT CEILING(10.1) --->11
- Kubectl patch命令使用
kubectl patch 使用(patch)补丁修改.更新资源的字段. 支持JSON和YAML格式. 请参阅https://htmlpreview.github.io/?https://github ...
- stand up meeting 1/13/2016
part 组员 工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云 UI测试和调整:与主程序完成合并 6 查漏补缺,扫除UI ...
- HTML学习过程-(1)
记录我HTML的学习 (1) 最开始学习html是在因为在听北京理工大学教授讲的网络公开课上.当时老师讲的是网络爬虫,因为要爬取特定网页的信息,需要借助[正则表达式](https://baike.ba ...
- 使用redis-dump与redis-load方式迁移redis数据库
实际生产场景中,有可能会因为迁移机房或者更换物理机等原因需要在生产环境迁移redis数据.本文就来为大家介绍一下迁移redis数据的方法. 迁移redis数据一般有如下3种方式: 1.第三方工具red ...
- C#开发BIMFACE系列34 服务端API之模型对比5:获取模型构件对比差异
系列目录 [已更新最新开发文章,点击查看详细] BIMFACE平台提供了服务端“获取修改构件属性差异”API,其返回的结果也是一个列表,仅针对修改的构件(不包含新增.删除的构件),是指对于一个 ...
- JACTF Web部分
掘安团队的题目 平台已不运营 Web签到 发现请求URL为flag.php,但是会跳转到404.php页面,抓包发现有302重定向,查看响应包,flag经过base64编码,解码即可 Tips: 重定 ...
- WPF中在Gmap.net中将Marker动起来
前一段时间说过一篇绘制极坐标的,这段时间对它进行了改造已经今非昔比了,功能实现了很多,我目的是让Marker动起来,然后还会绘制Route,上篇也就是简单的绘制了Route,没有关于Marker的相关 ...