##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__方法)