Python:hashlib加密,flask模块写接口

时间:2022-12-25 22:37:29

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) #括号里是自定义模块里的一个字典类型的值