目录
前后台的数据交互
drf
知识点概括
1. 框架安装
2. 接口
2.1 什么是接口
2.2 接口文档
2.3 接口工具的使用
2.4 restful 接口规范
debug 的使用
前后台的数据交互
前台安装 axios 插件, 进行与后台的数据交互
安装 axios, 并在 main.JS 中设置
params 传递拼接参数
data 携带数据包参数
headers 中发送头部信息, 但是必须使用 authorization 才能携带
- <script>
- export default {
- name: 'home',
- components: {
- },
- created(){
- this.$axios({
- url:'http://127.0.0.1:8000/test/',
- method:'get',
- // 拼接参数
- params:{
- a:1
- },
- // 数据包参数
- data:{
- x:10
- },
- headers:{
- // 前台的认证信息携带必须由 authorization 携带
- authorization:'abc.def11111111111'
- }
- }).then(response => {
- console.log('成功',response.data)
- }).catch(error => {
- console.log('shibai',error.response.data)
- })
- }
- }
- </script>
后台进行接受参数
必须设置 cors
headers 信息使用 META 中 HTTP_AUTHORIZATION 接收
- def test(request):
- print(request.method)
- print(request.GET) # 获取拼接参数
- print(request.body) # 获取数据包参数
- # 获取前端的 headers 信息 必需在 META 中 HTTP_AUTHORIZATION 接收
- print(request.META.get('HTTP_AUTHORIZATION'))
- return JsonResponse('ok',safe=False)
自定义请求头数据 META
在 django 中 settings 中设置
前端发送的请求头数据, 都会在 META 中存放, 包括自定义的请求头数据
后台获取: request.META.get('HTTP_参数名全大写')
- CORS_ALLOW_HEADERS = [
- "accept",
- "accept-encoding",
- "authorization",
- "content-type",
- "dnt",
- "origin",
- "user-agent",
- "x-csrftoken",
- "x-requested-with",
- # 自定义的请求头接受数据
- "token",
- "owen",
- ]
- drf
知识点概括
全称: Django-restframework
## 1. 接口
* 接口的概念
* 数据接口文档
* 接口规范(restful)
* Postman 接口测试工具
- ## 2.drf 请求周期
- ## 3.drf 的基础组件
* 请求
* 响应
* 渲染
* 解析
* 异常
## 4.drf 的序列化(核心)
* 序列化
* 模型序列化
* 群操作序列化
## 5.drf 的视图家族
* 视图类(常用)
* 视图工具类
* 工具视图类(常用)
* 视图集
## 6.drf 的三大认证(核心)
* 认证
* 权限
* 频率
## 7.drf 的过滤
* 筛选
* 搜索
* 排序
* 分页
* 区间
1. 框架安装
drf 是 Django 的框架, 所以要提前安装 Django
安装命令:
pip install djangorestframework
使用 drf 时, 要在 settings 中注册
2. 接口
2.1 什么是接口
规定了提交请求参数的请求方式, 访问其可以获取响应的反馈数据的 url 链接
四部分:
url 链接 + 请求方式 + 请求参数 + 响应数据
小猿取经 https://www.cnblogs.com/xiaoyuanqujing/articles/11869745.html
返回网页的叫网址, 返回数据的叫做接口
2.2 接口文档
编写接口文档, 使用 http://yapi.demo.qunar.com/
详情见小猿取经
2.3 接口工具的使用
将接口使用 postman 进行测试
https://www.getpostman.com/ 网址
6E823f587c95f0148c19993539b99295
2.4 restful 接口规范
1. url 链接
通常采用 https 协议
接口都是操作前后台数据的, 所以需要保证数据的安全性
使用 API 关键字标识接口 url
接口用来操作数据, 与网址 (操作页面) 有区别, 所以用特定的关键字表示接口
- - https://api.baidu.com
- - https://www.baidu.com/api
通常使用资源的复数形式, 不要出现操作资源的动词
接口操作的数据称之为 ` 资源 `, 在 url 中只体现 ` 资源名称(名词)`, 不体现 ` 操作资源的方式(动词)`
常规资源接口
- - https://api.baidu.com/books/
- - https://api.baidu.com/books/(pk)/
非常规接口
- 和某资源不是特别密切或是不止一种资源
- - https://api.baidu.com/login/
- - https://api.baidu.com/place/search
在 url 链接中标识数据版本
如果一个资源存在多版本结果, 在 url 链接中要用特定的符号来兼容多版本共存
- v1|v2
- - https://api.baidu.com/v1/books/
- - https://api.baidu.com/v1/books/
群资源操作, 一般还有额外的限制条件, 如排序, 限制调试, 分页等等
? 限制条件
- https://api.baidu.com/v1/books/?ordering=-price&limit=3
按照价格降序, 并且只显示 3 本
2. 五大请求方式
get: 获取单个或者多个资源
群查, 返回多个结果对象
- https://api.baidu.com/books/
单查, 返回单个结果对象
- https://api.baidu.com/books/(pk)/
post: 新增单个或多个资源
- https://api.baidu.com/books/
单增, 提交单个数据字典, 完成单增, 返回单个结果对象
群增, 提供多个数据字典的数组, 完成群增, 返回多个结果对象
put : 整体修改单个或多个资源
- https://api.baidu.com/books/
整体修改多个, 提供多个数据字典的数组(数据字典中要包含主键), 完成群改, 返回多个结果对象
- https://api.baidu.com/books/(pk)/
整体修改单个, 提供单个数据字典(主键在 url 中体现), 完成单改, 返回单个结果对象
patch : 局部修改单个或多个资源
方式与 put 完全相同, 不同的是:
操作的资源如果有 5 个 key-value 键值对, put 请求提供的字典必须全包含, 但是 patch 提供的字典包含的键值对 0~5 个都可以
delete : 删除单个或多个资源
- https://api.baidu.com/books/
多删, 提供多个资源主键数据, 完成群删, 不做任何资源返回(但一般我们会返回结果信息: 成功 | 失败)
- https://api.baidu.com/books/(pk)/
单删, 不需要提供额外数据, 完成单删除, 不做任何资源返回(但一般我们会返回结果信息: 成功 | 失败)
3. 响应结果
网络状态码:
网络状态信息和网络状态码捆绑出现, 不要额外设置
1xx: 基本信息
2xx: 成功
-200 基本
-201 新增成功
3xx: 重定向
4xx: 客户端错误
- 400 错误请求
- 403 请求无权限
- 404 请求资源不存在
5xx: 服务端错误
- 500 服务器错误
数据状态码(一般都是前后台约定规则)
0: 成功
1: 失败
1xx: 具体失败信息(要在接口文档中明确写出)
2: 无数据
2xx: 具体无数据信息(要在接口文档中明确写出)
数据状态信息
一般不仅仅是对数据状态码的解释, 更多的是对结果的描述, 给前台开发者阅读的
数据结果
常量数组字典, 如果有子资源(图片, 音频, 视频), 返回资源的 url 连接
- {
- 'status':0,
- 'msg':'ok',
- 'results':[{
'name':'西游记,
- 'img':'https://api.baidu.com/book/xyj.png'
- }]
- }
debug 的使用
views.py
查询数据的方式
- # 一个视图类可以包含常规五个请求方法
- # 五个请求方法处理是个资源操作的逻辑
- class BookView(View):
- # 单查数据
- def _single_get(self,pk):
- book_dic = models.Book.objects.filter(pk=pk).values('name','price').first()
- if not book_dic:
- return JsonResponse({
- 'static': 1,
- 'msg': '单查资源不存在',
- })
- return JsonResponse({
- 'static':0,
- 'msg':'单查 ok',
- 'results':book_dic
- })
- # 群查数据
- def _many_get(self):
- book_query = models.Book.objects.values('name','price')
- book_list = list(book_query)
- return JsonResponse({
- 'static':0,
- 'msg':'群差 ok',
- 'results':book_list
- })
- # 查询数据
- def get(self,request,*args,**kwargs):
- pk = kwargs.get('pk')
- if pk:
- return self._single_get(pk)
- else:
- return self._many_get()
来源: http://www.bubuko.com/infodetail-3347176.html