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链接 - 请求参数:前台按照指定 ...
随机推荐
- jetCache 基本使用
1.pom引用 <!--jetcache缓存 lettuce--> <dependency> <groupId>com.alicp.jetcache</gro ...
- 简单完成Excel导出
Excel的导出只需要三步即可完成: 1,完成excel的工具类编写,直接复制即可 package cn.com.bcl.util; import java.util.List; import org ...
- k8s~helm镜像版本永远不要用latest
对于容器编排工具k8s来说,你可以使用它规定的yaml格式的脚本,使用客户端kubectl来与k8s进行通讯,将你定义好的yaml部署脚本应用到k8s集群上,而这对yaml脚本一般来说都是很像的,就是 ...
- IKAnalyzer修改支持lucene8.0
源码已经上传GitHub. 如果直接使用jar:IKAnalyzer-5.0.2. 在这我只是在原有代码结构上做了微调,让代码支持lucene8.0.
- AJ学IOS(56)网络基础以及如何搭建服务器
AJ分享,必须精品 一:为什么要学习网络编程 关于这个问题,为什么要学习网络编程,AJ的理解就是,这东西是时代发展的必要,没什么为什么,就是应该学,除非你就是想玩单机,但是就算是单机也会有购买金币之类 ...
- XFS文件系统的备份与恢复
永久修改主机名:hostnamectl set-hostname oldboy临时修改主机名:hostname xfsdump备份xfsdump -f 备份的文件位置 要备份的分区或者磁盘 免交互备份 ...
- PAS
一.概念 二.安装 打开Delphi,在主菜单上选择Component,单击Install Component,出现图所示的对话框.有两个选择,装到已经存在的包里面和装到新的包里面.我们选择后者,单击 ...
- Present CodeForces - 1323D (思维+二分)
题目大意比较简单,就是求一堆(二元组)的异或和. 思路:按位考虑,如果说第k位为1的话,那么一定有奇数个(二元组)在该位为1.二元组内的数是相加的,相加是可以进位的.所以第k位是0还是1,至于k为后边 ...
- L - Neko does Maths CodeForces - 1152C 数论(gcd)
题目大意:输入两个数 a,b,输出一个k使得lcm(a+k,b+k)尽可能的小,如果有多个K,输出最小的. 题解: 假设gcd(a+k,b+k)=z; 那么(a+k)%z=(b+k)%z=0. a%z ...
- reactnavigation 5.x简单例子
随着RN和reactnavigation的版本更新,网上很多老版的例子都不能用了. 自己摸索着跑通了一些简单的功能. 使用的是最新的 "react-native": &quo ...