1.短信验证码分析
目的:为了校验是一个真实的用户,便于用户注册
注意点:
1/在获取短信验证码的时候需要携带的参数:手机号,随机字符串(uuid
),图片验证码
2/使用云通讯发送短信
2.云通讯集成
目的:能够使用云通讯发送短信
操作步骤:
1/先注册云通讯,创建应用
2/找到官方的demo实例下载
3/拷贝模板代码到自己的文件中(自己创建sms)
4/调用单例对象方法,发送短信即可
3.短信验证码接口
目的:当前端的页面点击获取短信验证码的时候,能够获取一条短信
请求路径: /passport/sms_code
请求方式: POST
请求参数: mobile, image_code,image_code_id
返回值: errno, errmsg
参数解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
mobile | string | 是 | 手机号 |
image_code | String | 是 | 图片验证码内容 |
image_code_id | String | 是 | 图片验证码编号 |
返回值解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
error | int | 是 | 错误码 |
errmsg | String | 是 | 错误信息 |
操作流程:
1/获取参数
2/校验参数,图片验证码,随机字符串(是一个为空判断)
3/校验参数,手机号格式
4/发送短信,调用封装好的ccp
5/返回发送的状态
接口四要素:请求路径/请求方式(post)/请求参数(图片验证码,随机字符串和手机号)/返回值(jsonify)
但是上面的过程是不严谨的,我们后面会对其进行优化
4.短信验证码接口完善
目的:完善短信接口的编写
操作步骤:
1/获取参数
2/参数的为空校验
3/校验手机号的格式
4/通过图片验证码的编号获取图片验证码
5/判断图片验证码是否过期
6/判断图片验证码是否正确
7/删除redis
中的图片验证码
8/生成一个随机的短信验证码,调用ccp
发送短信,判断是否发送成功
9/将短信保存到redis
中
10/返回一个响应(成功或者是失败)
5.注册用户接口
目的:创建一个用户对象,保存在数据库中
请求路径:/passport/register
请求方式:POST
请求参数: mobile, sms_code,password
返回值: errno, errmsg
参数解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
mobile | string | 是 | 手机号 |
sms_code | String | 是 | 短信验证码内容 |
password | String | 是 | 密码 |
返回值解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
error | int | 是 | 错误码 |
errmsg | String | 是 | 错误信息 |
操作步骤:
1/获取参数
2/校验参数,为空校验
3/手机号作为key
,取出redis
中的短信验证码
4/判断短信验证码是否过期
5/判断短信验证码是否正确
6/删除短信验证码
7/创建用户对象
8/设置用户对象的属性
9/保存用户到数据库中
10/返回响应
测试的时候我们可以将手机的验证码在工作区的控制台进行打印,不需要总是发短信,耗费财力.
6.注册用户接口完善
目的:使用flask
中提供好的方法,快速将前端的json
数据转成dict
传统方法,json
转字典
1/json_data = request.data
2/dict_data = json.loads(json_data)
快速将json
转字典的方法:
dict_data = request.json
或者dict_data = request.get_json()
7.注册用户密码
目的:使用flask
中提供的安全模块,将密码进行加密
注意点:
1/@property
装饰方法之后,可以被属性使用
2/@属性.setter
,给方法增加一个设置方式
3/generator_password_hash()
系统提供的加密方法
4/check_password_hash()
系统提供的密码校验方法
8.登录接口
目的:写出登录接口,供前端的工程师来调用登录
请求路径: /passport/login
请求方式:POST
请求参数: mobile,password
返回值: errno, errmsg
参数解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
mobile | string | 是 | 手机号 |
password | String | 是 | 密码 |
返回值解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
error | int | 是 | 错误码 |
errmsg | String | 是 | 错误信息 |
操作步骤:
1/获取参数
2/校验参数,为空校验
3/通过用户的手机号到数据库查询用户对象
4/判断用户是否存在
5/校验用户密码是否正确
6/将用户的登录信息保存在session
中
7/返回响应
9.首页右上角用户显示
目的:在首页右上角显示用户的登录信息
请求路径:/
请求方式: GET
请求参数: 无
返回值:index.html页面, data数据
参数解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
返回值解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
render_template | 页面 | 是 | 渲染页面 |
data | 字典 | 否 | 用户字典数据 |
data数据格式解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
user_info | 字典 | 是 | 具体用户字典 |
操作流程;
1/登录用户之后,已经将session
信息存储在redis
了
2/当我们刷新首页的时候,去session
中获取了user_id
的值
3/然后将用户的字典数据,携带到index.html
首页展示了
10.退出用户
目的:在认证蓝图中编写退出接口
对数据的增删改都用post
请求,单是查询的时候我们只需要get
就可以了
请求路径:/passport/logout
请求方式: POST
请求参数: 无
返回值: errno, errmsg
参数解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
返回值解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
error | int | 是 | 错误码 |
errmsg | String | 是 | 错误信息 |
操作流程:
1/清除session
session.pop(user_id,None)
清除这个人,如果没有弹出None
,以免报错
2/返回响应
11.用户最后登录时间
目的:记录用户的登录时间,为了方便后期进行用户的活跃统计
工具:
databases
工具,可以在pycharm
中连接数据,方便查询等操作
structure
工具,可以查看当前文件的结构(当前模块中有哪些视图函数)
12.自动提交
目的:在flask通过sqlalchemy
的属性配置,让数据库在视图函数结束的时候都能自动的提交
操作流程:
在config
的配置文件中,设置sqlalchemy_commit_on_teardown = True
设置好了之后,当数据库的内容改变之后,视图函数在结束的时候就会自动提交
13.CSRFProtect校验开启
目的:在前端当中携带csrf_token
,以便csrf
的校验都能通过
校验过程:
如果是非表单提交(ajax)
1/在cookie中设置csrf_token
(自己做)
2/在请求头中设置csrf_token
(自己做)
3/服务器:取出二者进行校验(服务器做的)
如果是表单提交
1/在表单中设置一个隐藏字段即可
cookie
如果不设置有效期,每次会话结束后都会清空
CSRFProtect
一旦保护好app之后会对如下请求做校验POST,PATH,PUT,DELETE
14.热门新闻排行
根据点击量,将新闻进行降序排列,然后依次渲染显示到热门新闻排行.
请求路径: /
请求方式:GET
请求参数: 无
返回值: index.html页面, data数据,用户字典,新闻字典
参数解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
返回值解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
render_template | 页面 | 是 | 渲染页面 |
data | 字典 | 否 | 新闻字典数据,用户字典数据 |
data内容解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
click_news_list | 字典 | 是 | 基础新闻字典 |
user_info | 字典 | 是 | 用户字典 |
15.分类数据显示
目的:在首页的头部展示分类信息
请求路径:/
请求方式:GET
请求参数: 无
返回值:index.html页面, data数据,用户字典,新闻排行字典,分类字典
参数解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
返回值解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
render_template | 页面 | 是 | 渲染页面 |
data | 字典 | 否 | 新闻字典数据 |
data内容解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
click_news_list | 字典 | 是 | 基础新闻字典 |
user_info | 字典 | 是 | 用户字典 |
categories | 字典 | 是 | 分类字典 |
操作流程:
1/在根路径中查询所有的分类数据
2/将分类数据转成字典列表
3/携带分类数据渲染页面
16.首页新闻列表展示
目的:编写新闻展示列表,获取新闻数据展示在首页中
请求路径: /newslist
请求方式: GET
请求参数: cid,page,per_page
返回值: data数据
参数解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
cid | int | 是 | 分类编号,默认最新 |
page | int | 是 | 页数,默认第1页 |
per_page | int | 是 | 每页多少条数据,默认10条 |
返回值解释:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
data | 字典 | 否 | 没有data包含,直接响应 |
data**参数详情如下:**
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
totalPage | int | 否 | 总页数 |
currentPage | int | 否 | 当前页面 |
cid | string | 是 | 当前新闻数据的分类编号 |
newsList | 列表list | 否 | 新闻列表数据 |
newsList内容如下:
参数名 | 类型 | 是否必须 | 参数说明 |
---|---|---|---|
newsList.title | string | 是 | 新闻列表 |
newsList.source | string | 是 | 新闻来源 |
newsList.create_time | string | 是 | 新闻时间 |
newsList.index_image_url | string | 是 | 新闻索引图片 |
操作步骤:
1/获取参数
2/参数类型转换
3/分页查询
4获取到分页对象中的属性,总页数,当前页,当前页的对象列表
5/将对象列表转成字典列表
6/携带数据,返回响应
要求:
1/访问首页的时候进行展示.
2/数据渲染利用局部刷新,利用ajax
优质文章推荐:
公众号使用指南
redis操作命令总结
前端中那些让你头疼的英文单词