自动化-day7-Python基础(Redis、加密、mock接口、网络请求)
1、Redis
Redis是一种非关系型数据库
与MySQL、orcal、SQLserver等关系型数据库不同之处在于:非关系型数据库Redis数据存放在内存中,且以键值对的方式存储,读写速度很快。
Redis数据库主要包含string和hash两种数据类型
a、连接数据库
1 r = redis.Redis(host='111.111.111.111', 2 password='HK139bc&*', 3 port=6379, 4 db=14, 5 decode_responses=True#将默认显示从byte类型改为字符类型 6 )
b、字符串操作
使用set方法插入数据,get方法取数据,只能插入字符串类型
1 r.set('矿泉水','{"price":111,"count":11}') 2 print(r.get('矿泉水'))
※返回为bytes类型,如需改类型需使用decode或encode方法:
r.set('矿泉水','{"price":111,"count":11}') data = r.get('矿泉水') print(data.decode()) s='123123' print(s.encode())
使用delete方法删除数据
r.delete('矿泉水')
c、hash类型
哈希类型不同于字符串的键值对格式,而是name-key-dict的格式,即表名-键-字典的格式
哈希类型使用方法hset、hget、hgetall插入、读取、读取全部数据
r.hset('students','fd','{"money":19999}') r.hset('students','ds','{"money":19111999}') r.hset('students','lhy','{"money":19111999}') r.hset('students','ljj','{"money":19111999}') print(r.hget('students','ds'))
使用hdel方法删除表中数据
r.hdel('students','ds')
使用delete方法删除整张表
r.delete('students')
使用expire方法来设置数据过期时间
r.expire('students',100)
d、其他常用方法
print(r.keys())#展示库中所有的key print(r.keys('s*'))#展示符合条件的kye print(r.type('stu'))#展示对应数据的类型 print(r.type('students')) print(r.flushdb()) #清空当前数据库里面所有的key print(r.flushall())#清空所有数据库里面所有的key
Redis数据库自带时间戳,可以设置数据过期时间。过期的数据会自动删除。可以在set方法中增加参数设置过期时间。
expire_time = 60 * 60 * 24
r.set('fd_session','sdgx312vsdrq',expire_time)
管道操作
当需要大量使用Redis操作数据时建议使用管道操作,即将多次操作打包成一次操作,减少访问数据库次数以提升效率。
#管道,批量操作 p = r.pipeline()#建立管道 print(p.exists('students123'))#判断是否存在数据,但由于管道还未执行,所以无返回值 p.hset('students','fd','{"money":19999}') p.hset('students','ds','{"money":19111999}') p.hset('students','lhy','{"money":19111999}') p.hset('students','ljj','{"money":19111999}') p.hgetall('students') s = p.execute() #执行,返回一个list,这个list里面是每个命令执行的结果 print(s) print(r.exists('students123'))
2、加密操作
a、md5加密
md5加密方式无法反向破解,但同样的明文加密后密文也相同,网上破解方法是明文与密文对应破解,无法反向解密。使用时需声明md5模块。
同样,当用户登录时。会对明文密码加密后与数据库进行对比以完成登录操作。
Python使用md5加密是需声明hashlib模块,之后使用hashlib.md5方法进行加密
※但需要注意的是,md5加密只能操作bytes型数据。
b、bas64加密
bas64一般用作数据传输时的加密方式,该方式可以反向破解。使用时需声明base64模块。
加密时使用base64.b64encode方法,解密时使用base64.b64decode方法
1 import base64 2 3 #加密 4 s='dgsdgs2323t牛寒阳' 5 r = base64.b64encode(s.encode()) 6 print(r.decode()) 7 8 #解密 9 r = base64.b64decode('bGl1aGFpeWFuZzI2NjIzQDQyJCMj5Lit5paH') 10 print(r.decode())
3、mock接口
a、主要使用Fastapi工具,改工具自带接口文档,方便查看。
使用Fastapi需声明fastapi和uvicorn模块
写接口时首先调用fastapi创建server
server = fastapi.FastAPI()
然后创建接口装饰器
@server.get('/login')
再指定接口的函数、参数及参数类型
def login(username: str, password: str):
最后在函数中编写逻辑即可
※注意在函数中的参数会直接跟在url后,如果想加在body中,需要声明from fastapi import From,并且在函数中增加request及From
@server.get('/login') def login(username: str, password: str): if username.strip() and password.strip(): p = tools.my_md5(password)#使用自定义函数加密password query_sql = 'select * from app_myuser where username= "%s" and passwd=%s;' % (username, p) if tools.excute(query_sql):#使用自定义函数在数据库执行SQL return {'code': '0', 'msg': '登录成功'} else: return {'code': '-1', 'msg': '输入的用户名/密码错误'} else: return {'code': '-1', 'msg': '不能为空'}
运行时使用uvicorn创建服务即可
uvicorn.run(server,port=8888,debug=True,host='0.0.0.0')#host写为0000可以使用本机IP地址访问url,自己访问仍然使用127.0.0.1即可
b、轻量级web开发框架flask
使用方式与fastapi大体相同,先创建server
server = flask.Flask(__name__)
定义接口
@server.route('/login',methods=['post','get'])
函数定义及参数获取
※与fastapi不同,参数来源不需要区别,url或者from_date都可以自动获取
def login(): username = flask.request.values.get('username','') password = flask.request.values.get('password','') # flask.json.get('xxxx')#如果入参是json类型的话,这么搞 # flask.request.cookies.get('xxx')#获取cookie里面的数据 # flask.request.headers.get('xx') # flask.request.files.get("xxx")#文件
运行时需要执行,debug=True时,代码变更会自动reloading
server.run(host='0.0.0.0',port=8999,debug=True)
4、网络请求
主要使用两个模块来做请求url
a、Python自带的urllib
urllib是Python自带的请求url模块,但需要将参数转为字符串,再转为bytes才能发送请求。获取请求后还要转成字符串再转成json。
b、requests,也是基于urllib的模块,但使用上更加简便
使用requests发送请求
# get请求 r = requests.get(url,data) # post请求 r = requests.post(url,json=data) #Cookie: cookie = {'wp-settings-1':'1','PHPSESSID':'xxxxx'} headers = { 'user-agent':'xxxx', 'cookie':'wp-settings-1=libraryContent%3Dbrowse%26posts_list_mode%3Dexcerpt%26editor%3Dtinymce%26post_dfw%3Doff%26imgsize%3Dfull%26editor_plain_text_paste_warning%3D1%26hidetb%3D1; wp-settings-time-1=1573143656; comment_author_8ec14a05b6903cd9021ece26c7b908a0=111; PHPSESSID=2e33445700b8381f67cafb40ee147480'} r = requests.post(url,data=data,params={"version":1.0},cookies=cookie) r = requests.post(url,data=data,params={"version":1.0},headers=headers) #params是把参数传到url后头的 #文件 data = {'file':open('shuaige.xls','rb')} r = requests.post(url,files=data)
请求后获取返回值
print(r.json() ) #->字典 #d.get('') print(r.text) #字符串格式 print(r.content) #bytes类型的 print(r.status_code) #返回的状态码