经典案例之某新闻网站的实现(二)

2019-07-18 11:25:15 浏览数 (1)

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操作命令总结

前端中那些让你头疼的英文单词

0 人点赞