Python:hashlib加密,flask模块写接口
hashlib模块
主要用于加密相关的操作,(比如说加密字符串)在python3的版本里,代替了md5和sha模块,主要提供 sha1, sha224, sha256, sha384, sha512 ,md5 这些加密方式
import hashlib
m=hashlib.md5(s.encode()) #字符串转化为二进制的,必须得传一个bytes类型的
m.update(b"Hello") #b代表二进制字节bytes,把字符串hello转成字节,然后加密;用b给一个变量转换的方式,待查
m.update(bytes('hello',encoding='utf-8')) #与上面结果一样,只是换成bytes函数,要加上encoding='utf-8'
print(m.hexdigest()) #获取到加密后的结果,md5加密,此加密方法是不可逆的,不可解密
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
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)   #括号里是自定义模块里的一个字典类型的值
                    
                
                
            
        
浙公网安备 33010602011771号