第一步:进行环境的搭建(用到的IDE:pycharm ,数据库为mysql、nacicat、编辑语言python3.7、以及自己配置的虚拟环境venvpy37)
Django==2.2
配置好mysql数据库的连接
第二步就是需求分析和app的设计:
大致上分为 四个app(也就是四个模块,Django是按app来开发的)
- users--用户相关
- courese--课程相关
- organization--机构相关
- operation-用户操作相关
然后新建完app并调整好结构,静态文件的文件夹static,html页面的文件夹templates,媒体文件文件夹media等
因为系统自带的User表字段没有需要的字段所以自己新建覆盖了一张用户表来存储用户信息
django提供一种方式让我们可以重载它的类
继承AbstractUser
在模型文件里设计好之后,需要在全局文件里设置
运行makemigrations和migrate 生成迁移文件和表
还有coures相关的表:课程表、章节、视频、课程资源 四个表
organizations:城市表、课程机构表、讲师表
operations:用户咨询表、课程评论表、用户收藏表、用户信息表、用户课程表
代码太多就不详细贴上去了
在设计过程种使用了分层设计 避免循环导入不同app中的model
配置好相关的path 路径
然后用xadmin来搭建后台管理系统:在github上搜索xadmin下载
然后配置好urls.py的路径
使用xadmin 可以自己识别用户自己定义的表
然后在之前新建好的每个app里 新建adminx.py文件 配置后台 例如:course app
这里包括了列表、过滤 、搜索、编辑框的功能 list_display 为列表 search-fields 搜索列 list_filter 过滤 list_editable 编辑框
接下来就是开始第一个功能的编写:登录
在做登录之前需要配置好首页和登录页面
然后编写逻辑函数 在views.py文件
使用的是CBV的逻辑来开发
CBV-class base view(优点:
class是可以继承的 为了后期便于维护有利于代码重用
)
因为是登录所以和用户相关是在users这个app里的views里编写
这里的代码逻辑 全部备注好了: 登陆页面有两种请求 一种是提交的post 一种是get
然后下面就是逻辑判断 ,判断用户是否存在 存在就登陆,用django 内部的login方法
否则就返回错误信息,并返回表单验证的错误信息
这是前端页面的判断逻辑,
这里的判断逻辑是:如果在表单验证中发现用户名或者密码错误:将前端样式的输入框变成红色
登陆开发完了之后:就是开发退出登陆的借口
编写的View函数都是继承django 本身自带的view
编写一个LogoutView(View)
然后再urls.py中修改一下配置
然后就是在html页面配置退出的url
这里的url 都是这样的书写格式 和前面的path 的name属性 一直 它会自动识别出路径 而且方便后期维护,只需要改动path的url路径名
接下来还学习了一种用手机验证码来登陆的功能以及注册:
首先为了能够发送手机验证码,需要找有发送手机短信资质的运营商 ,这里使用的是云片网 (具体如何注册使用就不说明了)
在云片网:www.yunpian.com
此时准备完之后就需要在pycharm中编写代码了:
在apps文件夹下新建一个目录为utils 专门存放这种工具类文件
查看API文档有步骤说明
我们短信验证只需要用到单条短信发送 进入相关的文档说明里
这是相关的参数,只需选择3个必传参数即可 其他参数看需求
apikey 在控制台里
apikey 最好在项目的全局设置里配置好 方便后期更改
短信发送需要用到request
这里的if __name__== "__main__"
用来测试的
这里的url 为文档说明中的url, text 为云片网审核通过的模板样式
有了url 和text 之后就是发送数据了:
通过request的post方法 一个参数为url 一个参数为data data为dict形式
dict里面的值为文档里面要传的参数
这样就算完成了,但是还需要用ajax的方式来完成短信验证码的发送用到了js的知识
这里return不用rander 而是用JsonResponse 因为这里是用ajax 异步发送短信此时,上面提到的403错误不能再用
因为原本用form表单提交的方式只需要在form标签 里加入{% csrf_token %}即可 浏览器会帮我们直接表单里的所有值
但是我们使用ajax异步的方式来进行方式 这样浏览器就不会帮我们提交上去
所有使用{% csrf_token %} 并没有用
此时就用到csrf_exempt() 让服务器不验证csrf
此时思考一下 如果在js文件里面 添加csrf_token 获取这个值是否可以???但是在html页面点击查看源码可以看出值并没有赋值进来 所以这个方法行不通
这里还牵涉到了redis来记录发送的数据
通过云片网发送验证码之后 这个验证码我们得保存起来 进行验证
所以保存数据:第一种 就是保存在数据库 另一种就是保存在内存中
用存在内存的方式 有两个问题:
1. 重启django之后,变量不存在了
2.随着验证码越来越多,,内存占用越来越大,验证码过期处理
用数据库可以实现 但是有特殊情况 发送完验证码之后用户并没有进行后续操作 这样数据就会越来越多
此时用 redis k-v数据库
(redis要运行起来 redis-server.exe redis-cli.exe)
import redis
把redis的对象取出来赋给r,然后r.set 模式来持久化
同时验证码还需要一个验证逻辑,我们使用表单来验证 这个验证码和发送的验证码是否一致
把redis对象取出来之后查询它的code值 和 表单提交的code 进行比较 如果不相等抛出异常
这里的抛出异常我们用 raise
如果正确就返回这个code
:
还需要动态验证码:
在github上搜索 django-captcha-simple 里面有安装和配置步骤
然后文档会告诉如何使用,按照步骤我们创建一个表单
有了这个表单之后在views.py里面我们把表单里的传递过去 ,并显示到前段页面
这里的两个只会显示其中一个不会冲突
这样动态验证码就实现了
接下来就是配置前段的html的url 和逻辑判断
所有的配置完了之后不要忘记配置urls.py文件的路径
动态登陆的逻辑完了之后需要实现动态注册的功能:
注册页面也有两个请求 1个是get 1个post ,get 请求需要获取到注册页面的动态验证码
post 请求是要把前段提交的数据存储,但是有两个判断逻辑,第一个是用户没有注册,这个比较简单把用户提交的数据存储到数据库里面, 第二个逻辑是用户已经注册过了,此时需要用到表单验证,专门验证mobile这个字段时候存在
然后注意前段页面的配置:
form表单的方法要是post方法 action属性值为{% url 'register'%}这种形式
input标签的name属性的值要和view函数里一一对应 并且注意403错误 在表单里加入 {%csrf_token%}
然后就是错误信息判断完的显示,和之前在做登陆的时候一样