复习

  1. """
  2. 1、vue如果控制html
  3. 在html中设置挂载点、导入vue.js环境、创建Vue对象与挂载点绑定
  4. 2、vue是渐进式js框架
  5. 3、vue指令
  6. {{ }}
  7. v-text|html => 限制一次性渲染 v-once
  8. v-if|show
  9. v-if v-else-if v-else
  10. v-for
  11. v-model
  12. v-bind [c1, c2] | {active: isActive}
  13. v-on fn | fn(...) | fn($event, ...)
  14. {{ data中出现的变量 }} v-if="data中出现的变量 的条件表达式"
  15. 4、vue实例成员
  16. el | template
  17. components
  18. data {} | data () { return {} }
  19. methods
  20. computed:定义的是方法属性
  21. watch:监听属性
  22. props
  23. <div id="app">
  24. <Nav :subdata="supdata" @subaction="supaction"></Nav>
  25. </div>
  26. 5、生命周期钩子
  27. 都是实例成员,在组件创建到销毁整个过程的某些时间节点回调的函数
  28. beforeCreated() {
  29. this._fn => this.$option.methods._fn
  30. }
  31. 6、项目
  32. 环境:node => npm(cnpm) => vue/cli
  33. 创建与配置 vue create proj | 选择基础插件 | 配置npm启动
  34. 插件:vue-router | vuex | axios | vue-cookies | element-ui
  35. """

drf框架

全称:django-rest framework

知识点

  1. """
  2. 1、接口:什么是接口、restful接口规范
  3. 2、CBV生命周期源码 - 基于restful规范下的CBV接口
  4. 3、请求组件、解析组件、响应组件
  5. 4、序列化组件(灵魂)
  6. 5、三大认证(重中之重):认证、权限(权限六表)、频率
  7. 6、其他组件:过滤、筛选、排序、分页、路由
  8. """
  9. # 难点:源码分析

接口

  1. """
  2. 接口:联系两个物质的媒介,完成信息交互
  3. web程序中:联系前台页面与后台数据库的媒介
  4. web接口组成:
  5. url:长得像放回数据的url链接
  6. 请求参数:前台按照指定的key提供数据给后台
  7. 响应数据:后台与数据库交互后将数据反馈给前台
  8. """

restful接口规范

接口规范:就是为了采用不同的后台语言,也能使用同样的接口获取到同样的数据

如何写接口:接口规范是 规范化书写接口的,写接口要写 url、响应数据

​ 注:如果将请求参数也纳入考量范围,那就是在写 接口文档

两大部分:

  • url
  1. 1) api关键字标识接口url
  2. api.baidu.com | www.baidu.com/api
  3. 2) 接口数据安全性决定优先选择https协议
  4. 3) 如果一个接口有多版本存在,需要在url中标识体现
  5. api.baidu.com/v1/... | api.baidu.com/v2/...
  6. 4) 接口操作的数据源称之为 资源,在url中一般采用资源复数形式,一个接口可以概括对该资源的多种操作方式
  7. api.baidu.com/books | api.baidu.com/books/(pk)
  8. 5) 请求方式有多种,用一个url处理如何保证不混乱 - 通过请求方式标识操作资源的方式
  9. /books get 获取所有
  10. /books post 增加一个(多个)
  11. /books/(pk) delete 删除一个
  12. /books/(pk) put 整体更新一个
  13. /books/(pk) patch 局部更新一个
  14. 6) 资源往往涉及数据的各种操作方式 - 筛选、排序、限制
  15. api.baidu.com/books/?search=西&ordering=-price&limit=3
  • 响应数据
  1. 1) http请求的响应会有响应状态码,接口用来返回操作的资源数据,可以拥有 操作数据结果的 状态码
  2. status 0(操作资源成功) 1(操作资源失败) 2(操作资源成功,但没匹配结果)
  3. 注:资源状态码不像http状态码,一般都是后台与前台或是客户约定的
  4. 2) 资源的状态码文字提示
  5. status ok '账号有误' '密码有误' '用户锁定'
  6. 3) 资源本身
  7. results
  8. 注:删除资源成功不做任何数据返回(返回空字符串)
  9. 4) 不能直接放回的资源(子资源、图片、视频等资源),返回该资源的url链接

基于restful规范的原生Django接口

主路由:url.py
  1. from django.conf.urls import url, include
  2. from django.contrib import admin
  3. urlpatterns = [
  4. url(r'^admin/', admin.site.urls),
  5. # 路由分发
  6. url(r'^api/', include('api.urls'))
  7. ]
api组件的子路由:api/url.py
  1. from django.conf.urls import url
  2. from . import views
  3. urlpatterns = [
  4. url(r'^books/', views.Book.as_view()),
  5. url(r'^books/(?P<pk>.*)/$', views.Book.as_view()),
  6. ]
模型层:model.py
  1. from django.db import models
  2. class Book(models.Model):
  3. title = models.CharField(max_length=64)
  4. price = models.DecimalField(max_digits=5, decimal_places=2)
  5. class Meta:
  6. db_table = 'old_boy_book'
  7. verbose_name = '书籍'
  8. verbose_name_plural = verbose_name
  9. def __str__(self):
  10. return '《%s》' % self.title
后台层:admin.py
  1. from django.contrib import admin
  2. from . import models
  3. admin.site.register(models.Book)
数据库迁移
  1. >: python manage.py makemigrations
  2. >: python manage.py migrrate
  3. >: python manage.py createsuperuser
视图层:views.py
  1. from django.http import JsonResponse
  2. from django.views import View
  3. from . import models
  4. # 六大基础接口:获取一个 获取所有 增加一个 删除一个 整体更新一个 局部更新一个
  5. # 十大接口:群增 群删 整体改群改 局部改群改
  6. class Book(View):
  7. def get(self, request, *args, **kwargs):
  8. pk = kwargs.get('pk')
  9. if not pk: # 群查
  10. # 操作数据库
  11. book_obj_list = models.Book.objects.all()
  12. # 序列化过程
  13. book_list = []
  14. for obj in book_obj_list:
  15. dic = {}
  16. dic['title'] = obj.title
  17. dic['price'] = obj.price
  18. book_list.append(dic)
  19. # 响应数据
  20. return JsonResponse({
  21. 'status': 0,
  22. 'msg': 'ok',
  23. 'results': book_list
  24. }, json_dumps_params={'ensure_ascii': False})
  25. else: # 单查
  26. book_dic = models.Book.objects.filter(pk=pk).values('title', 'price').first()
  27. if book_dic:
  28. return JsonResponse({
  29. 'status': 0,
  30. 'msg': 'ok',
  31. 'results': book_dic
  32. }, json_dumps_params={'ensure_ascii': False})
  33. return JsonResponse({
  34. 'status': 2,
  35. 'msg': '无结果',
  36. }, json_dumps_params={'ensure_ascii': False})
  37. # postman可以完成不同方式的请求:get | post | put ...
  38. # postman发送数据包有三种方式:form-data | urlencoding | json
  39. # 原生django对urlencoding方式数据兼容最好
  40. def post(self, request, *args, **kwargs):
  41. # 前台通过urlencoding方式提交数据
  42. try:
  43. book_obj = models.Book.objects.create(**request.POST.dict())
  44. if book_obj:
  45. return JsonResponse({
  46. 'status': 0,
  47. 'msg': 'ok',
  48. 'results': {'title': book_obj.title, 'price': book_obj.price}
  49. }, json_dumps_params={'ensure_ascii': False})
  50. except:
  51. return JsonResponse({
  52. 'status': 1,
  53. 'msg': '参数有误',
  54. }, json_dumps_params={'ensure_ascii': False})
  55. return JsonResponse({
  56. 'status': 2,
  57. 'msg': '新增失败',
  58. }, json_dumps_params={'ensure_ascii': False})

Postman接口工具

官网下载安装

get请求,携带参数采用Params

post等请求,提交数据包可以采用三种方式:form-date、urlencoding、json

所有请求都可以携带请求头

DRF框架

安装
  1. >: pip3 install djangorestframework
drf框架规矩的封装风格
  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. from rest_framework.request import Request
  4. from rest_framework.serializers import Serializer
  5. from rest_framework.settings import APISettings
  6. from rest_framework.filters import SearchFilter
  7. from rest_framework.pagination import PageNumberPagination
  8. from rest_framework.authentication import TokenAuthentication
  9. from rest_framework.permissions import IsAuthenticated
  10. from rest_framework.throttling import SimpleRateThrottle
  11. class Test(APIView):
  12. def get(self, request, *args, **kwargs):
  13. return Response('drf get ok')
drf请求生命周期
  1. """
  2. 1) 请求走的是APIView的as_view函数
  3. 2) 在APIView的as_view调用父类(django原生)的as_view,还禁用了 csrf 认证
  4. 3) 在父类的as_view中dispatch方法请求走的又是APIView的dispatch
  5. 4) 完成任务方法交给视图类的请求函数处理,得到请求的响应结果,返回给前台
  6. """

请求模块:request对象

源码入口

APIView类的dispatch方法中:request = self.initialize_request(request, *args, **kwargs)

源码分析
  1. """
  2. # 二次封装得到def的request对象
  3. request = self.initialize_request(request, *args, **kwargs) 点进去
  4. # 在rest_framework.request.Request实例化方法中
  5. self._request = request 将原生request作为新request的_request属性
  6. # 在rest_framework.request.Request的__getattr__方法中
  7. try:
  8. return getattr(self._request, attr) # 访问属性完全兼容原生request
  9. except AttributeError:
  10. return self.__getattribute__(attr)
  11. """
重点总结
  1. # 1) drf 对原生request做了二次封装,request._request就是原生request
  2. # 2) 原生request对象的属性和方法都可以被drf的request对象直接访问(兼容)
  3. # 3) drf请求的所有url拼接参数均被解析到query_params中,所有数据包数据都被解析到data中
  1. class Test(APIView):
  2. def get(self, request, *args, **kwargs):
  3. # url拼接的参数
  4. print(request._request.GET) # 二次封装方式
  5. print(request.GET) # 兼容
  6. print(request.query_params) # 拓展
  7. return Response('drf get ok')
  8. def post(self, request, *args, **kwargs):
  9. # 所有请求方式携带的数据包
  10. print(request._request.POST) # 二次封装方式
  11. print(request.POST) # 兼容
  12. print(request.data) # 拓展,兼容性最强,三种数据方式都可以
  13. print(request.query_params)
  14. return Response('drf post ok')

渲染模块:浏览器和Postman请求结果渲染数据的方式不一样

源码入口

APIView类的dispatch方法中:self.response = self.finalize_response(request, response, *args, **kwargs)

源码分析
  1. """
  2. # 最后解析reponse对象数据
  3. self.response = self.finalize_response(request, response, *args, **kwargs) 点进去
  4. # 拿到运行的解析类的对象们
  5. neg = self.perform_content_negotiation(request, force=True) 点进去
  6. # 获得解析类对象
  7. renderers = self.get_renderers() 点进去
  8. # 从视图类中得到renderer_classes请求类,如何实例化一个个对象形参解析类对象列表
  9. return [renderer() for renderer in self.renderer_classes]
  10. # 重点:self.renderer_classes获取renderer_classes的顺序
  11. # 自己视图类的类属性(局部配置) =>
  12. # APIView类的类属性设置 =>
  13. # 自己配置文件的DEFAULT_RENDERER_CLASSES(全局配置) =>
  14. # drf配置文件的DEFAULT_RENDERER_CLASSES
  15. """
全局配置:所有视图类统一处理,在项目的settings.py中
  1. REST_FRAMEWORK = {
  2. # drf提供的渲染类
  3. 'DEFAULT_RENDERER_CLASSES': [
  4. 'rest_framework.renderers.JSONRenderer',
  5. 'rest_framework.renderers.BrowsableAPIRenderer',
  6. ],
  7. }
局部配置:某一个或一些实体类单独处理,在views.py视图类中提供对应的类属性
  1. class Test(APIView):
  2. def get(self, request, *args, **kwargs):
  3. return Response('drf get ok')
  4. def post(self, request, *args, **kwargs):
  5. return Response('drf post ok')
  6. # 在setting.py中配置REST_FRAMEWORK,完成的是全局配置,所有接口统一处理
  7. # 如果只有部分接口特殊化,可以完成 - 局部配置
  8. from rest_framework.renderers import JSONRenderer
  9. class Test2(APIView):
  10. # 局部配置
  11. renderer_classes = [JSONRenderer]
  12. def get(self, request, *args, **kwargs):
  13. return Response('drf get ok 2')
  14. def post(self, request, *args, **kwargs):
  15. return Response('drf post ok 2')

django drf插件(一)的更多相关文章

  1. django DRF理解

    django restframework(DRF) 最近的开发过程当中,发现restframework的功能很强大,所以尝试解读了一下源码,写篇博客分享给大家,有错误的地方还请各位多多指出 视图部分 ...

  2. 解决Django + DRF:403 FORBIDDEN:CSRF令牌丢失或不正确,{"detail":"CSRF Failed: CSRF cookie not set."}

    我有一个Android客户端应用程序尝试使用Django + DRF后端进行身份验证.但是,当我尝试登录时,我收到以下响应: 403: CSRF Failed: CSRF token missing ...

  3. 第三百九十节,Django+Xadmin打造上线标准的在线教育平台—Django+cropper插件头像裁剪上传

    第三百九十节,Django+Xadmin打造上线标准的在线教育平台—Django+cropper插件头像裁剪上传 实现原理 前台用cropper插件,将用户上传头像时裁剪图片的坐标和图片,传到逻辑处理 ...

  4. django framework插件使用1

    安装 REST框架要求以下内容: Python(3.5.3.6.3.7) Django(1.11.2.0.2.1.2.2) pip install djangorestframework pip in ...

  5. Django DRF 分页

    Django DRF 分页 分页在DRF当中可以一共有三种,可以通过setttings设置,也可也通过自定义设置 PageNumberPagination 使用URL http://127.0.0.1 ...

  6. django xadmin 插件(3) 列表视图新增自定义按钮

    效果图: 编辑按钮是默认的list_editable属性对应的插件(xadmin.plugins.editable) 放大按钮对应的是自定义插件. 自定义按钮源码: xplugin.py(保证能够直接 ...

  7. django drf 基础学习5

    一 简介: 用户登录的验证 二 验证机制:    1 session session需要在服务端存储能够通过session_id而获取的信息,每次请求到达服务端时,需要根据session_id这个ke ...

  8. django drf 基础学习3

    一 简述 这里来谈下一些基本原理 二 汇总 1 restful规范 1 根据method不同做不同的操作          request.method='          get(获取) 返回完整 ...

  9. django drf 基础学习2

    DRF基本程序调用一 models初步编写  1 编写model.py    from django.db import models 导入    class dbinfo(models.Model) ...

随机推荐

  1. 2018京东校招Java笔试题

    相比阿里巴巴,京东的题都是考研基础题,加上一点java基础知识和linux命令. 1. 单选题(19道题,每题2分): 1)4个并发进程都需要5个同类资源,则至少需要多少个资源,才不会导致死锁? 2) ...

  2. Linux磁盘与文件系统管理概要

    Linux磁盘与文件系统管理 硬盘组成与分区 硬盘组成 圆形的盘片(主要记录数据) 机械手臂与磁头(可读取盘片上的数据) 主轴马达,转动盘片,让机械手臂的磁头在盘片上读取数据 扇区(Sector)为最 ...

  3. Java实现 LeetCode 820 单词的压缩编码(暴力)

    820. 单词的压缩编码 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", & ...

  4. Java实现 LeetCode 786 第 K 个最小的素数分数(大小堆)

    786. 第 K 个最小的素数分数 一个已排序好的表 A,其包含 1 和其他一些素数. 当列表中的每一个 p<q 时,我们可以构造一个分数 p/q . 那么第 k 个最小的分数是多少呢? 以整数 ...

  5. Java实现 LeetCode 398 随机数索引

    398. 随机数索引 给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引. 您可以假设给定的数字一定存在于数组中. 注意: 数组大小可能非常大. 使用太多额外空间的解决方案将不会通过测试 ...

  6. java实现 洛谷 P1014 Cantor表

    题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 - 2/1 2/2 2/3 2/4 - ...

  7. java实现第六届蓝桥杯垒骰子

    垒骰子 题目描述 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰 ...

  8. Linux 用户和用户组管理-用户信息文件

    用户信息文件存在在/etc/passwd中,vi /etc/passwd 其中,有七列以:分隔的信息 第一列表示用户(account),第二列表示密码标志(真正的密码存在在/etc/shadow中), ...

  9. Spring IOC 概念及作用

    一:程序之间的耦合及解决 耦合性(Coupling):也叫耦合度,是对模块间关联程度的度量.耦合的强弱取决于模块间接口的复杂性.调用模块的方式以及通过界面传送数据的多少.模块间的耦合度是指模块之间的依 ...

  10. Linux笔记(第一天)

    一.命令 lscpu                               -- 查看cpu free                                 -- 内存查看 -m 以M ...