zoukankan      html  css  js  c++  java
  • Python Day 81 element-ui、web接口(postman请求工具)、restful 接口规范、drf框架、request源码分析

      ##element-ui

    /*
    element-ui:饿了么开发的 基于vue上的bootstrap
        bs按照特点的页面结构,赋予特点的class与属性 => eu书写特点的组件标签构建特点的结构
        总结:复制粘贴    eu:24    bs:12
    */
    
    #安装:项目目录下的终端
    cnpm i element-ui -S
    
    #配置:main.js
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    Vue.use(ElementUI);
    
    #使用:官方API
    https://element.eleme.cn/#/zh-CN/component/installation
    
    <!--案例-->
    <el-row>
        <el-button>默认按钮</el-button>
        <el-button type="primary">主要按钮</el-button>
        <el-button type="success">成功按钮</el-button>
        <el-button type="info">信息按钮</el-button>
        <el-button type="warning">警告按钮</el-button>
        <el-button type="danger">危险按钮</el-button>
    </el-row>

      ##web接口

    """
    1、有前台访问后台的 url链接
    2、请求需要传递的 必须和可选参数
    3、请求得到想要的 返回结果
    
    
    # 请求工具:postman => https://www.getpostman.com/
    
    # 接口:url链接,通过向链接发生不同的类型请求与数据得到相应的响应数据
    
    # http://127.0.0.1:8888/test/
    # 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://www.baidu.com/api
    
    3)版本:不同版本需要标注 - 接口迭代出现多版本共存
        https://api.baidu.com/v1
        https://api.baidu.com/v2
    
    4)资源:请求的目标数据称之为资源,单资源采用资源名称名词,多资源采用资源名称名词的复数
        https://api.baidu.com/v2/book | https://api.baidu.com/v2/books
        https://api.baidu.com/book | https://api.baidu.com/books
    
    5)请求方式:错误示范 - get_book|add_book  vs  正确示范 - book
        https://api.baidu.com/get_book|add_book  vs  https://api.baidu.com/book
        
        操作资源的方式的正确体现:不是通过动词,而是通过请求的方式
        -- get:https://example.com/api/v1/books  获取所有
        -- get:https://example.com/api/v1/book/1  获取id=1一本
        -- post:https://example.com/api/v1/book  新增一本
        -- 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)资源过滤:通过接口传递参数来过滤资源 - limit|ordering|page
        -- https://example.com/api/v1/books?limit=10  限制10条
        
    7)数据状态码:返回数据要标准状态码,通过在数据中 {"status": 0} - 注:数据状态码都是约定的(不是死的)
        -- SUCCESS("0", "查询成功")
        -- NODATA("1", "非正确,无数据,显示基本信息")
        -- FEAILED("2", "查询失败")
        
    8)错误信息:请求失败需要标注错误信息 - {"error": "错误信息"} => {"msg": "数据状态描述信息"}
    
    9)数据(操作的资源返回结果):{"results": []} | {"data": []} | {"token": "*"}
    
    10) 子资源返回资源接口:返回的资源如果有子资源,返回子资源的链接地址,如查找书,书的封面图片就可以url表示
    """

      ##drf框架

    #安装与使用
    # 1)安装drf:pip3 install djangorestframework
    
    # 2)settings.py注册app:INSTALLED_APPS = [..., 'rest_framework']
    
    # 3)基于cbv完成满足RSSTful规范的接口
    
    # 视图层
    
    # 基于原生Django
    from django.http import JsonResponse
    from django.views import View
    
    class Book(View):
        def get(self, request, *args, **kwargs):
            data_dic = {
                'status': 0,
                'msg': 'get ok',
                'results': {
    
                }
            }
            return JsonResponse(data_dic)
    
        def post(self, request, *args, **kwargs):
            data_dic = {
                'status': 0,
                'msg': 'post ok',
                'results': {
    
                }
            }
            return JsonResponse(data_dic)
    
        def delete(self, request, *args, **kwargs):
            # ...
            return JsonResponse('', safe=False)
    
    
    # 基于Django REST Framework框架
    # drf是django写满足restful规定接口的一个插件
    from rest_framework.views import APIView
    from rest_framework.request import Request
    from rest_framework.response import Response
    from rest_framework.viewsets import ViewSet, ModelViewSet
    from rest_framework.exceptions import APIException
    from rest_framework.pagination import PageNumberPagination
    
    # 自定义设置:settings.py
    """
    REST_FRAMEWORK = {
        # 自定义配置
    }
    """
    
    # APIView类
    # as_view(): 就干了一件事:csrf_exempt(view) 禁用了csrf中间件的安全认证
    # dispatch(): #注-----是重写父类view的dispatch方法
    #   1) 二次封装request对象,将原wsgi的request对象保留至 _request 中
    #   2) 将数据包中的数据解析到request.data,将url链接?后的数据解析到request.query_params
    #   3) drf的三大认证:认证组件、权限组件、频率组件
    #   4) 二次处理响应对象response在返回
    class User(APIView):
        def get(self, request, *args, **kwargs):
            data_dic = {
                'status': 0,
                'msg': 'get ok',
                'results': {
    
                }
            }
            return Response(data_dic)
    
        def post(self, request, *args, **kwargs):
            a = request.query_params.get('a')
            x = request.data.get('x')
            print(a, x)
            data_dic = {
                'status': 0,
                'msg': 'post ok',
                'results': {
    
                }
            }
            return Response(data_dic)
    
    
    # 路由层
    from app import views
    urlpatterns = [
        url(r'^users/', views.Users.as_view()),
    ]

      ##request源码分析

    # 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)

       ##统一总结源码

    -源码分析:
        继承了APIView 之后:
            -1 所有的请求都没有csrf的认证了
            -2 在APIView中as_view本质还是调用了父类的as_view(View的as_view)
            -3 as_view中调用dispatch  -----》这个dispatch是APIView的dispatch
    
    -APIVIew的dispatch方法:
        -1 对原生request对象做了一层包装(面向对象的封装),以后再用的request对象都新的request对象
        -2 在APIView中self.initial(request, *args, **kwargs),里面有频率控制,权限控制和认证相关
        -3 根据请求方法执行咱们写的视图类中的相应方法
            --视图类中方法的request对象,已经变成了封装后的request
    -Request类:
        -1 原生的request是self._request
        -2 取以post形式提交的数据,从request.data中取(urlencoded,formdata,json格式)
        -3 query_params 就是原生request的GET的数据
        -4 上传的文件是从FILES中取
        -5 (重点)其他的属性,直接request.属性名(因为重写了__getattr__方法)
  • 相关阅读:
    360°视频论文调研
    360°视频相机调研
    Oculus VR眼镜调研
    VR论文调研
    3ds Max学习日记(十)——显示场景资源管理器
    最近在学习Flask框架,那么就说下jinja2吧~~~
    最近学习了Sqlite3数据库,写一下操作应用以及命令
    HTML5游戏开发,剪刀石头布小游戏案例
    jquery简单的图片切换效果,支持pc端、移动端的banner图片切换开发
    jquery简单的大背景banner图片全屏切换
  • 原文地址:https://www.cnblogs.com/liangzhenghong/p/11347809.html
Copyright © 2011-2022 走看看