hashlib模块
主要用于加密相关的操作,(比如说加密字符串)在python3的版本里,代替了md5和sha模块,主要提供 sha1, sha224, sha256, sha384, sha512 ,md5 这些加密方式
import hashlib
m = hashlib.md5() #用md5加密的方式(md5加密后无法解密),创建一个md5的对象
m.update(b"Hello") #b代表二进制字节bytes,把字符串hello转成字节,然后加密;用b给一个变量转换的方式,待查
m.update(bytes('hello',encoding='utf-8')) #与上面结果一样,只是换成bytes函数,要加上encoding='utf-8'
print(m.digest()) #2进制格式的加密后的字符串
print(len(m.hexdigest())) #16进制格式的加密后的字符串
PS:不同的加密方式,用法都同上,把md5换一下就行,下面以sha1为例:
# ######## sha1 加密方式########
hash = hashlib.sha1()
hash.update('admin')
print(hash.hexdigest())
加盐:
SAIT='*hn*36t34fhj86' #盐值,可以随便取,但一个模块里所有的盐值应取一样的,用于和其他密码连起来,然后md5加密,提高安全性
flask模块 :
是一个web框架,可以开发接口
eg1:下面写一个登录的接口,登录需要url username passwd
import flask
from flask import request,jsonify #引入请求,用来请求数据;引入json
server=flask.Flask(__name__) #创建一个服务,把当前这个python文件当做一个服务
user=’admin’
p=’houning123’
server.config[“JSON_AS_ASCII”]=False #这句话是使返回值的汉字在浏览器里显示正常
@server.route('/login',methods=['get']) #flask自带的装饰器,这一步是把普通函数变成一个服务,括号里是路径和获取方法
def login():
username=request.values.get(‘username’) #指获取到传的key:“username”的值,把值赋给左边的username
passwd=request.values.get(‘passwd’)
if username and passwd: #判断用户名密码是否为空
if username==user and passwd==p:
res={“code”:1000,”msg”:”登录成功”}
else:
res={“code”:2000,”msg”:”账户或密码错误”}
return jsonify(res)
else:
return jsonify({“code”:1999,”msg”:”必填参数未填”}) #把字典转化成json串格式
server.run(debug=True) #启动服务,debug=True是指调试模式,如果改代码,服务就会自动重启
server.run(port=8888,debug=True,host='0.0.0.0') #指定端口号,不指定的话默认是5000;debug是自己调试用的,给别人写接口不要加debug;
不指定host,默认是127.0.0.1,是本机的ip,只能自己访问,指定0.0.0.0的话,别人都能访问,代表监听多块网卡上面所有的ip
启动服务在start.py模块里就行,api.py里不要启动服务了,避免重复
eg2:写一个获取用户id的接口
@server.route('/get_user_id',methods=['post','get'])
def get_user_id():
if request.method=='POST':
username = request.values.get('username')
token = request.values.get('token')
if username and token:
sql = 'select id from user where username = "%s";'%username
sql_res = OpertionMysql(sql)
if sql_res:
res = OpRedis('user:'+username)
if res:
if token==res:
return jsonify(sql_res)
else:
return jsonify(msg.TOKEN_ERR)
else:
return jsonify(msg.NO_LOGIN)
else:
return jsonify(msg.USER_NOT_FOUND)
else:
return jsonify(msg.NOT_NULL)
else:
return jsonify(msg.METHOD_ERR)
eg3:写一个注册的接口
@server.route('/reg',methods=['post','get'])
def reg():
username = request.values.get('username')
passwd = request.values.get('password')
c_passwd = request.values.get('c_passwd')
if username and passwd and c_passwd:
sql = 'select id from user where username = "%s";'%username
sql_res = OpertionMysql(sql)
if sql_res:
return jsonify(msg.USER_ERR2)
else:
if passwd==c_passwd:
new_password = md5Password(passwd)
insert_sql = 'insert into user (username,password) VALUE ("%s","%s");'%(username,new_password)
OpertionMysql(insert_sql)
return jsonify(msg.SUCCESS)
else:
return jsonify(msg.PASSWORD_DIFF)
else:
return jsonify(msg.NOT_NULL)
eg4:写获取json串类型入参(post请求)的接口,上面几个例子是获取key和value类型的入参(username=request.values.get('username'))
import flask
from flask import request,jsonify
server=flask.Flask(__name__)
@server.route('/json',methods=['post'])
def json_res():
res=request.json #这种方式是获取json类型的入参内容;获取到的数据类型是字典类型
;request.values.get('XXX')这种适用于get、post请求获取key和value类型
的入参(?XXX=xxx&yyy=yyy 或者jmeter的body里填key value这两种传参格式)
print(res) #打印出入参的json串,是字典类型
return jsonify({"msg":"ok"})
eg5:牛牛博客:30行代码写上传下载文件接口
import flask,os,time
from flask import request,send_from_directory,jsonify app = flask.Flask(__name__)#创建一个app,代表这个web服务 @app.route('/get_file',methods=['get']) def get_file(): #下载文件接口 filename = request.values.get('fname',None) #获取需要下载的文件名 if filename:#如果获取到的文件名话 if os.path.isfile(filename):#判断是否是一个文件 #返回要下载的文件 return send_from_directory('.',filename,as_attachment=True) else: return jsonify({"msg":"文件不存在!"}) else: return jsonify({'msg':'文件名不能为空'}) @app.route('/files',methods=['get']) def file_list(): #获取文件列表接口 files = os.listdir('.')#获取当前目录下所有文件 new_files = [f for f in files if os.path.isfile(f)] #三元运算符,把是文件的放到list中 return jsonify({"files":new_files}) @app.route('/upload',methods=['post']) def upload(): #上传文件接口 f = request.files.get('file_name',None) if f: t = time.strftime('%Y%m%d%H%M%S')#获取当前时间 new_file_name = t+f.filename#给文件重命名,防止有重复文件覆盖 f.save(new_file_name)#保存文件 return jsonify({"code":"ok"}) else: return jsonify({"msg":"请上传文件!"}) app.run(debug=True,port=8888)#启动这个web服务eg6:写从redis获取数据、给redis写入数据的两个接口
import redis #定义一个操作hash类型redis的函数
def get_hash_all(name,key=None,v=None):
r=redis.Redis(host=REDIS_HOST,password=REDIS_PASSWD,port=REDIS_PORT,db=REDIS_DB)
if key and v:
r.hset(name,key,v)
res=88
else:
res=r.hgetall(name)
return res
@server.route('/get_sites',methods=['get']) #写一个从redis取数据的接口
def get_sites():
res=get_hash_all('sites') #取出来的res是字典类型,sites里面的key和value是bytes类型
all_sites=[] #定义一个列表,放所有取出的数据
for k,v in res.items(): #字典循环的时候要用items方法
new_res = {}
new_res['sites_name']=k.decode() #decode方法是把bytes类型转换成字符串类型
new_res['url']=v.decode()
all_sites.append(new_res) #把一个个字典添加到列表里
return jsonify(all_sites) #字典和列表都可以被json格式化
@server.route('/set_sites',methods=['post']) #写一个给redis设置值的接口
def set_sites():
req=request.json #req代表的是传入的json串,是一个字典类型
if req.get('site') and req.get('url'): #字典取值用get方法,如果取不到值就返回None
k=req.get('site')
v=req.get('url')
get_hash_all('sites',k,v) #把传入的值写入到redis里
return jsonify(msg.SUCCESS)
else:
return jsonify(msg.NOT_NULL) #括号里是自定义模块里的一个字典类型的值