zoukankan      html  css  js  c++  java
  • 1223 drf引入以及restful规范

    前后台的数据交互

    前台安装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 接口文档

    编写接口文档,使用yapi

    详情见小猿取经

    2.3 接口工具的使用

    将接口使用postman进行测试

    postman网址

    6E823f587c95f0148c19993539b99295
    

    img

    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的使用

    img

    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()
    
    
  • 相关阅读:
    Oracle优化器模式不同导致索引失效
    Python补零操作
    正则表达式
    python习题(二)
    Linux常见报错及解决方法(持续更新)
    总结(三)----2020上
    总结二
    总结---持更
    python多线程实现方式,最基础的实现方式模块是什么
    python2和python3区别
  • 原文地址:https://www.cnblogs.com/fwzzz/p/12089067.html
Copyright © 2011-2022 走看看