基于python的网络爬虫与数据可视化分析,基于python+selenium进行web端的测试
一、前言登录功能是每个系统的基础,本篇实现了基于代币的用户登录和请求权限控制。
二、数据库模型模型文件夹下新建user.py,创建对象关系映射(对象关系映射)实体类
# !/usr/bin/python3
# -*-编码:utf-8 -*-
@作者:胡国栋
@版本:
-
@File : user.py
@描述:用户表
@CreateTime : 2020/3/7 14:45
-
@ModifyTime:
导入摘要算法
从关系导入功能
从数据库导入数据库
来自模特。基本模型导入基本模型
类用户(基本模型):
用户表
__tablename__=t_user
id=db .列(db .Integer,primary_key=True,autoincrement=True,comment=用户ID’)
昵称=db .列(db .字符串(30),注释=用户昵称)
用户名=数据库。列(db .字符串(30),注释=登录账号)
user_type=db .列(db .布尔型,默认值=1,注释=用户类型(1系统用户)
email=db .列(db .字符串(50),注释=用户邮箱)
电话=db .列(db .字符串(20),注释=手机号)
电话号码=db .列(db .字符串(11),注释=手机号码)
性别=db .列(db .整数,默认值=1,注释=用户性别(1男2女3未知))
头像=db .列(db .字符串(100),注释=头像路径)
密码=db .列(db .字符串(50),注释=密码)
盐=db .列(db .字符串(20),注释=盐加密)
状态=db .列(db .整数,默认值=1,注释=帐号状态(1正常2禁用)
部门标识=数据库。列(db .整数,注释=部门id’)
del_flag=db .列(db .整数,默认值=1,注释=删除标志(1代表存在2代表删除))
login_ip=db .列(db .字符串(50),注释=最后登陆IP’)
登录日期=数据库。列(db .时间戳,注释=最后登陆时间,可空=假,
onupdate=func.now())
定义检查_密码(self,passwd):
检查密码
:参数密码:
:返回:0/1
# 创建讯息摘要5对象
m=hashlib.md5()
b=passwd.encode(编码=utf-8 )
m。更新(二)
str_md5=m.hexdigest()
if self.password==str_md5:
返回一
否则:
返回0
三、创建蓝图1 .许可文件夹下新建蓝图文件user.py
从权限导入*
user=Blueprint(user ,__name__)
app.py注册蓝图
app。注册_蓝图(用户。user,url_prefix=/api/user)3。写一个测试方法
@user.route(/test ,methods=[GET])
定义测试():
返回成功()4。浏览器输入http://127 .0 .0 .1:5000/API/用户/测试
四、实现代币方法用代币校验身份,是前后端交互的常用方式。
它有以下特性:
会失效加密可以根据它拿到用户的信息
关于代币的方法写在实用工具下的common.py下
1.生成令牌:生成方式(内部配置的私钥有效期用户的编号用户名用户角色列表)
定义创建令牌(用户标识,用户名,角色列表):
生成代币
:返回:令牌
# 第一个参数是内部的私钥,这里写在共用的配置信息里了,如果只是测试可以写死
# 第二个参数是有效期(秒)
s=序列化程序(配置SECRET_KEY,expires_in=config .过期_英寸)
# 接收用户编号转换与编码
令牌=无
尝试:
token=s.dumps({id: user_id, name :用户名, role: role_list}).解码(“ascii”)
例外情况为e:
app.logger.error(获取代币失败:{}.格式(e))
返回令牌2。校验令牌:校验接收到的令牌,如果成功返回用户信息,否则返回没有人
定义验证令牌(令牌):
校验代币
:参数标记:
:返回:用户信息或者没有
# 参数为私有秘钥,跟上面方法的秘钥保持一致
s=序列化程序(配置SECRET_KEY)
尝试:
# 转换为字典
数据=s负载(令牌)
返回数据
例外情况为e:
返回无3 .有很多接口是必须登录才能操作的,最好的方式就是在写一个装饰器,添加在需要的美国石油学会(美国石油协会)上
定义登录_必需(*角色):
定义装饰器(函数):
@functools.wraps(func)
定义包装(*参数,* *千瓦):
尝试:
# 在请求头上拿到代币
令牌=请求。标题[授权]
例外情况为e:
# 没接收的到令牌,给前端抛出错误
返回jsonify(code=Code .NO_PARAMETER.value,msg=缺少参数令牌)
s=序列化程序(配置SECRET_KEY)
尝试:
用户=s负载(令牌)
如果角色:
# 获取代币中的权限列表如果在参数列表中则表示有权限,否则就表示没有权限
用户角色=用户[角色]
result=[x for x in user _ role if x in list(role)]
如果没有结果:
返回jsonify(code=Code .ERR_PERMISSOM.value,msg=权限不够)
例外情况为e:
返回jsonify(code=Code .LOGIN_TIMEOUT.value,msg=登录已过期)
返回函数(*参数,* *千瓦)
返回包装
返回装饰者这样只需在方法上添加装饰器就能限制用户访问
#限制只有管理可以操作
@user.route(/xxx ,methods=[POST])
@login_required(admin )
定义xxx()
返回xx五、用户登录点击前端页面的登录按钮,会请求登录接口
佩尔米松文件夹下的user.py新建登录方法
@user.route(/login ,methods=[POST])
定义登录():
用户登录
:返回:令牌
res_dir=request.get_json()
如果资源目录为无:
返回无参数()
# 获取前端传过来的参数
用户名=res_dir.get(用户名)
password=res_dir.get(password )
# 校验参数
如果不是全部([用户名,密码]):
返回jsonify(code=Code .NOT_NULL.value,msg=用户名和密码不能为空)
尝试:
user=User.query.filter_by(用户名=用户名)。首先()
例外情况为e:
app.logger.error(登录错误:{} 。格式(e))
返回jsonify(code=Code .REQUEST_ERROR.value,msg=获取信息失败)
如果用户为没有人或不是用户.检查_密码(密码)或user.del_flag==2或用户状态==2:
返回jsonify(code=Code .ERR_PWD.value,msg=用户名或密码错误)
# 获取用户信息,传入生成代币的方法,并接收返回的代币
# 获取用户角色
用户角色=角色。查询。join(User _ Role,Role.id==User_Role.role_id).加入(用户,
用户角色.用户标识==用户标识).过滤器(
User.id==user.id).全部()
role _ list=[用户角色中我的一、角色_关键
token=创建令牌(用户标识,用户用户名,角色列表)
data={token: token, userId: user.id,用户名:用户.用户名,昵称:用户.昵称}
# 记录登录互联网协议(互联网协议的缩写)将代币存入雷尔迪斯
尝试:
用户。登录_ip=请求。远程_地址
user.update()
雷迪斯。写(f token _ {用户。用户名} ,标记)
例外情况为e:
返回jsonify(code=Code .UPDATE_DB_ERROR.value,msg=登录失败)
如果令牌:
# 把代币返回给前端
返回jsonify(code=Code .SUCCESS.value,msg=登录成功,数据=数据)
否则:
返回jsonify(code=Code .REQUEST_ERROR.value,msg=请求失败数据=令牌)六、用户注销佩尔米松文件夹下的user.py新建注销方法
@user.route(/logout ,methods=[POST])
@login_required()
定义注销():
注销方法:redis删除代币
:返回:
尝试:
令牌=请求。标题[授权]
用户=验证令牌(令牌)
如果用户:
key=ftoken_{user.get(name)}
redis_token=Redis.read(key)
if redis_token:
Redis.delete(键)
返回成功()
否则:
返回AUTH_ERR()
例外情况为e:
app.logger.error(f 注销失败)
return REQUEST_ERROR()七、检查代币登录成功后,系统会请求一个检查令牌方法,主要是检查用户代币是否合法
佩尔米松文件夹下的user.py新建检查令牌方法
@user.route(/check_token ,methods=[POST])
定义检查令牌():
# 在请求头上拿到代币
令牌=请求。标题[授权]
用户=验证令牌(令牌)
如果用户:
key=ftoken_{user.get(name)}
redis_token=Redis.read(key)
if redis_token==token:
返回成功(data=user.get(id ))
否则:
return OTHER_LOGIN()
否则:
返回AUTH_ERR()
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。