经典案例之某新闻网站的实现(二)
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
优质文章推荐:
- ChIP-seq实战分析
- PHP中9大缓存技术总结
- servlet中request等中文乱码问题
- Ofbiz模块加载机制即创建独立模块(脱离热部署)
- ofbiz连接mysql并创建独立数据库
- Angular+servlet java实现前后端数据交互
- servlet容器tomcat和jetty的简单使用
- activiti学习笔记(一) 获取流程配置实例
- ofbiz 服务引擎(一) controller中服务的调用解析
- ofbiz实体引擎(九) 多租户
- SparkStreaming入门
- 拒绝重复造轮子,用composer搞自己的框架(2)
- 拒绝重复造轮子,用composer搞自己的框架(1)
- 我的第一次ChIP-seq实践
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 学习使用Material Design控件(四)Android实现标题栏自动缩放、放大效果
- Ubuntu 20.04 CUDA&cuDNN安装方法(图文教程)
- Android开发之基于DialogFragment创建对话框的方法示例
- Android图片压缩的实例详解
- Android编程之手机壁纸WallPaper设置方法示例
- 手把手教你在腾讯云上搭建hadoop3.x伪集群的方法
- Android从网络中获得一张图片并显示在屏幕上的实例详解
- Android ListView中headerview的动态显示和隐藏的实现方法
- Android编程使用Service实现Notification定时发送功能示例
- Android基于ViewFilpper实现文字LED显示效果示例
- Android ViewPager导航小圆点实现无限循环效果
- ViewPager打造轮播图Banner/引导页Guide
- Android 实现带字母索引的侧边栏功能
- Android实现简单底部导航栏 Android仿微信滑动切换效果
- Android中Handler与Message的简单实例