教程总体简介:项目概述 项目背景 项目的功能构架 项目的技术架构 CMS 什么是CMS CMS需求分析与工程搭建 静态门户工程搭建 SSI服务端包含技术 页面预览开发 4 添加“页面预览”链接 页面发布 需求分析 技术方案 测试 环境搭建 数据字典 服务端 前端 数据模型 页面原型 前端页面 上传图片开发 前端开发 图片查询 静态页面测试 CMS页面预览测试 CMS添加页面接口 搜索服务 搭建ES环境 后端工程搭建 导入CMS数据库 MongoEngine入门 在Django中使用MongoDB 定义文档 Logstash创建索引 创建搜索应用 定义ESClient 搜索前端技术需求 了解SEO 服务端渲染和客户端渲染 Nuxt.js入门 创建Nuxt工程 页面布局 路由 获取数据 搜索页面 查询全部 分页查询 按分类搜索 按难度等级搜索 集成测试 在线学习与媒资管理 在线学习需求分析 需求描述 视频点播解决方案 视频编码 FFmpeg的基本使用 生成m3u8/ts文件 播放器 搭建学习中心前端 媒资管理 开发环境 上传文件 断点续传解决方案 文件分块与合并 媒资服务端编写 视频处理 发送视频处理消息 我的媒资 选择视频 保存视频信息 Api接口 学习页面获取视频播放地址 在线学习接口 登录注册与认证授权 增加数据 修改数据 删除数据 查询数据 Q对象 其他 查询集 QuerySet 页面管理后端开发 接口说明 接口开发规范 JWT Django REST framework JWT 用户登录前端 前端显示当前用户 用户退出 前端集成认证授权 用户注册后端 订单与选课 分布式事务 问题描述 CAP理论 解决方案 自动添加选课方案 Celery Beat定时任务 订单服务定时发送消息 查询前N条任务 乐观锁取任务 RabbitMQ配置 学习服务添加选课 订单服务结束任务 传智云课堂 封装异常处理 封装JSON返回值 站点列表和模板列表接口 新增页面 页面查询接口定义 自定义条件查询 3 测试接口 页面详情 修改页面 删除页面 CMS前端工程创建 导入系统管理前端工程 单页面应用介绍 CMS前端页面查询开发 创建页面 Table组件测试 页面内容完善 跨域问题解决 进入页面立即查询 前后端请求响应流程小结 新增页面前端开发 页面处理流程 页面静态化及预览发布 页面静态化需求 模板管理 模板管理业务流程 模板制作 GridFS研究 模板存储
完整笔记资料代码:https://gitee.com/yinuo112/Backend/tree/master/Python/嘿马云课堂web完整实战项目/note.md
感兴趣的小伙伴可以自取哦~
全套教程部分目录:
部分文件图片:
增加数据
学习目标
- 掌握增加数据的方法
1 增加数据
增加数据有两种方法。
1、save
通过创建文档类对象,执行对象的save()方法保存到数据库中。
| |
2、create
通过模型类.objects.create()保存。
| |
2 小结
-
增加数据有两种方法
-
通过创建文档类对象,执行对象的save()方法
- 通过模型类.objects.create()保存
修改数据
学习目标
掌握修改数据的方法
1 修改数据
修改数据有两种方法
1、save
修改模型类对象的属性,然后执行save()方法
| |
2、update
使用模型类.objects.filter().update(),会返回受影响的行数
| |
2 小结
-
修改更新有两种方法
-
修改模型类对象的属性,然后执行save()方法
- 使用模型类.objects.filter().update()
删除数据
学习目标
- 掌握删除数据的方法
1 删除数据
删除有两种方法
1、文档类对象.delete()
| |
2、文档类.objects.filter().delete()
| |
2 小结
-
删除有两种方法
-
文档类对象.delete()
- 文档类.objects.filter().delete()
查询数据
学习目标
- 掌握基本查询方法
- 掌握对结果集进行过滤的方法
1 基本查询
get 查询单一结果,如果不存在会抛出文档类DoesNotExist异常。
all 查询多个结果。
count 查询结果数量。
| |
2 过滤查询
要对结果集进行过滤,可使用如下方法:
- filter 过滤出多个结果
- exclude 排除掉符合条件剩下的结果
- get 过滤单一结果
- 直接在文档类.objects()中传入过滤条件
对于过滤条件的使用,上述几个方法相同,故仅以filter进行讲解。
过滤条件的表达语法如下:
| |
1、比较查询
- ne 不等于(not equal to)
- gt 大于 (greater than)
- gte 大于等于 (greater than or equal to)
- lt 小于 (less than)
- lte 小于等于 (less than or equal to)
2、范围查询
- in 是否包含在范围内。
- nin 是否不包含在范围内。
| |
3、字符串查询
- exact – 与指定值完全匹配
- contains – 包含指定值
- startswith – 以指定值开始
- endswith – 以指定值结束
| |
3 小结
-
基础查询
-
get 查询单一结果
-
all 查询多个结果
-
count 查询结果数量
-
过滤查询
-
过滤条件的表达语法:属性名称__比较运算符=值
- 比较查询:ne、gt、gte、lt、lte
- 范围查询:in、nin
- 字符串查询:exact、contains、startswith、endswith
Q对象
学习目标
- 掌握Q对象的使用方法
1 Q对象
多个过滤器逐个调用表示逻辑与关系。
例:查询阅读量大于20,并且评论量小于30的图书。
| |
如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符。
语法如下:
| |
例:查询阅读量大于20的图书,改写为Q对象如下。
| |
Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。
例:查询阅读量大于20,或评论量小于30的图书,只能使用Q对象实现
| |
MongoEngine中的Q对象前不可以使用~操作符。
2 小结
- 语法如下:Q(属性名__运算符=值)
- Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或
其他
学习目标
- 掌握常用聚合函数的用法
- 掌握排序的用法
- 掌握关联查询的方法
1 聚合函数
常用的聚合函数有count 计数,sum 求和,average 求平均值
| |
2 排序
使用order_by对结果进行排序
| |
3 关联查询
1、由一到多的访问语法:
需要进行两步查询,例如:
| |
主要是因为MongoDB不支持连表
| |
2、由多到一的访问语法:
多对应的文档类对象.一对应引用字段属性名 例:
| |
3、访问一对应的文档类关联对象的id语法:
多对应的文档类对象.一对应引用字段属性名.id
例:
| |
4 小结
-
常用的聚合函数
-
count 计数
- sum 求和
-
average 求平均值
-
使用order_by对结果进行排序.order_by('bread')是升序,.order_by('-bread')是降序
-
关联查询
-
由一到多的访问语法:需要进行两步查询,MongoDB不支持连表查询
- 由多到一的访问语法:多对应的文档类对象.一对应引用字段属性名
- 访问一对应的文档类关联对象的id语法:多对应的文档类对象.一对应引用字段属性名.id
查询集 QuerySet
学习目标
- 了解查询集的概念
- 熟悉查询集的基本操作
1 概念
查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
当调用如下过滤器方法时,返回查询集(而不是简单的列表):
- all():返回所有数据。
- filter():返回满足条件的数据。
- exclude():返回满足条件之外的数据。
- order_by():对结果进行排序。
注:文档类.objects也会返回包含所有数据的查询集
对查询集可以再次调用过滤器进行过滤,如
| |
也就意味着查询集可以含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果。
判断某一个查询集中是否有数据:
- 使用 len() 查看查询集的长度是否为0
- 空的查询集相当于 False,可直接用于条件判断
2 限制查询集
可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句。
注意:不支持负数索引。
对查询集进行切片后返回一个新的查询集,不会立即执行查询。
如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常,[0:1].get()如果没有数据引发DoesNotExist异常。
示例:获取第1、2项,运行查看。
| |
可以通过first()方法获取查询集中的第一个元素,如果查询集为空,则返回None
| |
3 小结
- 查询集表示从数据库中获取的对象集合
- all、filter、exclude、order_by等返回查询集
- 可以对查询集进行取下标或切片操作
- 可以通过first()方法获取查询集中的第一个元素
页面管理后端开发
使用MongoEngine定义接口
学习目标
- 掌握使用MongoEngine定义接口的方法
前面我们了解了MongoEngine的基本使用方法,接下来我们看一下如何使用MongoEngine结合django-rest-framework-mongoengine实现接口的定义
1 定义序列化器
要使用MongoEngine文档对象作为model,需要继承rest_framework_mongoengine.serializers的DocumentSerializer来完成序列化器的定义
定义序列化器
booktest/serializer.py:
| |
2 定义视图集
视图集需要继承rest_framework_mongoengine.viewsets中的类作为基类
定义视图集
booktest/views.py:
| |
3 定义Router
使用MongoEngine文档对象相关的模型和序列化器定义的视图集,需要使用rest_framework_mongoengine.routers中的SimpleRouter或DefaultRouter来定义Router(两个Router重写了get_default_base_name方法)
定义urls
booktest/urls.py:
| |
注册urls和应用
cz_study/urls.py:
| |
cz_study/settings.py:
| |
4 测试接口
启动Django服务
| |
访问地址 [ 可以看到所有图书数据的列表,如下:
5 小结
-
使用MongoEngine定义接口的方法
-
定义序列化器:序列化器从rest_framework_mongoengine.serializers中继承
- 定义视图集:视图集需要继承rest_framework_mongoengine.viewsets中的类作为基类
- 定义router:需要使用rest_framework_mongoengine.routers中的SimpleRouter或DefaultRouter来定义Router(两个Router重写了get_default_base_name方法)
接口说明
接口开发规范
学习目标
- 了解项目的接口开发规范
1 接口开发规范
为了严格按照接口进行开发,提高效率,对请求及响应格式进行规范化。
1、get 请求时,使用querystring传参。
2、Post请求时,可以提交form表单数据(application/x-www-form-urlencoded)和Json数据(Content-Type=application/json),文件等多部件类型(multipart/form-data)三种数据格式,也可以在querystring中附加过滤、排序等参数。
3、响应结果统一信息为:是否成功、操作代码、提示信息及自定义数据。
4、响应结果统一格式为json。
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
success | bool | 是 | 是否成功 |
code | int | 是 | 状态码 |
message | str | 是 | 状态信息 |
data | 对象 | 是 | 数据对象 |
调用成功的返回值示例如下:
| |
调用失败的返回值示例如下:
| |
为满足这一需求,我们需要对接口返回进行定制:
- 调用失败时,通过抛出异常返回错误信息
- 将所有JSON返回封装成约定的格式