测试自动化学习8
批量备份py第三方模块
pip freeze > 第三方模块.txt # 批量安装第三方模块 pip install -r 第三方模块.txt
使用flask开发接口
import flask, json, random, string server = flask.Flask(__name__) @server.route('/login') # 紧贴着函数加上装饰器,就可以变成接口 def welcome(): session_id = ''.join(random.sample(string.ascii_letters + string.digits, 16)) # 随机16位字符串 data = {'code': 0, 'msg': '登陆成功', 'session_id': session_id} return json.dumps(data, ensure_ascii=False) @server.route('/test') # 紧贴着函数加上装饰器,就可以变成接口 def test(): data = {'code': 0, 'msg': 'test success!\n嘤嘤嘤\n一拳一个☝️的嘤嘤怪啊'} return json.dumps(data, ensure_ascii=False) # 返回中文不乱码 # 入参是get @server.route('/urldata') # get请求,参数在url里面的:http://127.0.0.1:8899/urldata?name=晴天娃娃&passwd=123456 def urlData(): msg = flask.request.args.get('name') passwd = flask.request.args.get('passwd') data = {'msg':msg, 'passwd':passwd} return json.dumps(data, ensure_ascii=False) # 入参是post的 @server.route('/post', methods=['post']) # post请求,参数在url里面的:http://127.0.0.1:8899/urldata?name=晴天娃娃&passwd=123456 def post(): # url形式传过来的 msg = flask.request.args.get('name') passwd = flask.request.args.get('passwd') # k-v模式传过来的 stu_name = flask.request.values.get('stu_name') addr = flask.request.values.get('addr') data = {'user':msg, 'passwd':passwd, 'stu_name':stu_name, 'addr':addr} return json.dumps(data, ensure_ascii=False) # 入参是json @server.route('/add_student2', methods=['post']) def add_stu2(): if flask.request.is_json: stu_name = flask.request.get_json('name') age = flask.request.get_json('age') sex = flask.request.get_json('sex') addr = flask.request.get_json('addr') phone = flask.request.get_json('phone') stu_class = flask.request.get_json('class') return json.dumps({'msg': '添加成功!', 'stu_name:': stu_name, 'age:': age, 'sex:': sex, 'addr:': addr, 'phone:': phone, 'class:': stu_class}, ensure_ascii=False) else: return json.dumps({'msg': '请传入json!'}, ensure_ascii=False) # 上传文件 @server.route('/file', methods=['post']) # 使用postman请求,文件在Body--form-data--key(类型选file)--value(上传本地文件) def uploadFile(): file = flask.request.files.get('f') print(file.filename) file.save(file.filename) # print(dir(file)) return json.dumps({'msg': '上传完成!'}, ensure_ascii=False) server.run(host='0.0.0.0', port=8899, debug=True) # 默认端口 5000,debug开关表示代码更改后自动重启服务(不要在生产环境中使用),host='0.0.0.0'指定ip则非本机也能访问
通过接口传参从数据库获取数据
import pymysql, hashlib import flask, json def op_mysql(sql: str): mysql_info = { 'host': '127.0.0.1', 'port': 3306, 'password': '123456', 'user': 'admin', 'db': 'stu', 'charset': 'utf8', 'autocommit': True } result = '执行完成' conn = pymysql.connect(**mysql_info) cur = conn.cursor(pymysql.cursors.DictCursor) # 建立游标 cur.execute(sql) if sql.strip().lower().startswith('select'): result = cur.fetchall() cur.close() conn.close() return result server = flask.Flask(__name__) @server.route('/table_data') def get_table_data(): table_name = flask.request.args.get('table_name') limit = flask.request.args.get('limit', '10') # 默认限制10个 allow_table = ['app_myuser', 'dxk_test', 'app_student', 'app_product'] if not table_name: return json.dumps({'msg:': 'table_name为必填字段'}, ensure_ascii=False) # if table_name not in str(op_mysql('show tables;')): # 未实现检查table是否存在 # return json.dumps({'msg:': 'table_name不存在'}, ensure_ascii=False) # # if table_name not in allow_table: # # return json.dumps({'msg:': '没有权限获取该表数据'}, ensure_ascii=False) if limit.isdigit(): sql = 'select * from %s limit %s' % (table_name, limit) else: return json.dumps({'msg:': 'limit请传入整数'}, ensure_ascii=False) res = op_mysql(sql) return json.dumps(res, ensure_ascii=False) server.run(debug=True)
拆分python功能模块
""" 主要分为一下文件 ➜ day8 git:(master) ✗ tree work work ├── README.txt ├── config │ ├── __pycache__ │ │ └── setting.cpython-37.pyc │ └── setting.py ├── lib │ ├── __pycache__ │ │ ├── interface.cpython-37.pyc │ │ └── tools.cpython-37.pyc │ ├── interface.py │ └── tools.py └── main.py """ # README.txt 介绍各文件夹功能及整个项目实现的功能,以及安装依赖等 # config 文件夹存放各种配置文件及参数,如一下setting文件内容 mysql_info = { 'host': '127.0.0.1', 'port': 3306, 'password': '123456', 'user': 'admin', 'db': 'stu', 'charset': 'utf8', 'autocommit': True } redis_info = { 'host': '127.0.0.1', 'password': '123456', 'db': 7, 'decode_responses': True } server_info = { 'host': '0.0.0.0', 'port': 8888, 'debug': True } SALT = 'kadsjijv' # lib 文件夹存放重新运行逻辑部分,如 tools 文件 import hashlib, pymysql, redis, time from config import setting def md5(s): s = (str(s) + setting.SALT).encode() m = hashlib.md5(s) # 加密 return m.hexdigest() def op_mysql(mysql_info, sql: str): result = '执行完成' conn = pymysql.connect(**mysql_info) cur = conn.cursor(pymysql.cursors.DictCursor) # 建立游标 cur.execute(sql) if sql.strip().lower().startswith('select'): result = cur.fetchall() cur.close() conn.close() return result def redis_add_session(redis_info, username: str): r = redis.Redis(**redis_info) r.set('prw_session:%s' % username, md5('%s' % username)) # 以 prw_session 为文件夹 prw_session:username和username 的md5为 k-v r.expire('prw_session:%s' % username, 3600 * 24) # username_md5 = md5('%s' % username) return md5('%s' % username) def get_user_session(redis_info, session_r: str): r = redis.Redis(**redis_info) list = [] for i in r.keys(): if 'prw_session:' in i: list.append(r.get(i)) if session_r in list: return True else: return False def StrToTimeStamp(str_time=None, format='%Y-%m-%d %H:%M:%S'): """格式化好的时间转时间戳""" if str_time: time_tuple = time.strftime(str_time, format) # 把格式化好的时间转为时间元祖 res = time.mktime(time_tuple) # 时间元祖转时间戳 return int(res) return int(time.time()) # 获取当前时间戳 def TimeStampToStr(timestamp=None, format='%Y-%m-%d %H:%M:%S'): if timestamp: time_tuple = time.localtime(timestamp) res = time.strftime(format, time_tuple) return res else: return time.strftime(format) #以及interface文件 import flask, json from config.setting import mysql_info from config.setting import redis_info from lib import tools server = flask.Flask(__name__) @server.route('/table_data') def get_table_data(): table_name = flask.request.args.get('table_name') limit = flask.request.args.get('limit', '10') # 默认限制10个 allow_table = ['app_myuser', 'dxk_test', 'app_student', 'app_product'] if not table_name: return json.dumps({'msg:': 'table_name为必填字段'}, ensure_ascii=False) # if table_name not in str(op_mysql('show tables;')): # 未实现检查table是否存在 # return json.dumps({'msg:': 'table_name不存在'}, ensure_ascii=False) # # if table_name not in allow_table: # # return json.dumps({'msg:': '没有权限获取该表数据'}, ensure_ascii=False) if limit.isdigit(): sql = 'select * from %s limit %s' % (table_name, limit) else: return json.dumps({'msg:': 'limit请传入整数'}, ensure_ascii=False) res = tools.op_mysql(mysql_info, sql) return json.dumps(res, ensure_ascii=False) @server.route('/login', methods=['post']) def login(): username = flask.request.values.get('username') password = flask.request.values.get('password') if not username and not password: return json.dumps({'msg:': 'username和password为必填字段'}, ensure_ascii=False) sql_checkname = "select count(*) as c from prw_users where user='%s';" % username # 查询用户名是否存在 res_cn = tools.op_mysql(mysql_info, sql_checkname) sql = "select password from prw_users where user='%s';" % username res = tools.op_mysql(mysql_info, sql) # [{'password': '5ee212502e41b931dff96f1a336783dd'}] if res_cn[0]['c'] == 0: return json.dumps({'msg:': '请输入正确的用户名/密码'}, ensure_ascii=False) passwd_r = res[0]['password'] if tools.md5('%s' % password) != passwd_r: return json.dumps({'msg:': '请输入正确的用户名/密码'}, ensure_ascii=False) else: username_md5 = tools.redis_add_session(redis_info, username) return json.dumps({"session": "%s" % str(username_md5), "code": 0, "msg:": "登录成功"}, ensure_ascii=False) @server.route('/add_qq_mem', methods=['post']) def add_qq_mem(): qq = flask.request.values.get('qq') nick = flask.request.values.get('nick') join_time = flask.request.values.get('join_time') gender = flask.request.values.get('gender') card = flask.request.values.get('card') session = flask.request.values.get('session') if tools.get_user_session(redis_info, session): if qq and nick and join_time and session: sql_checkqq = "select count(*) as c from prw_qq_mem where qq='%s';" % qq # 查询qq是否已存在 res_qq = tools.op_mysql(mysql_info, sql_checkqq) if res_qq[0]['c'] == 1: return json.dumps({'msg:': 'QQ号码已存在,请重新输入'}, ensure_ascii=False) else: sql = "insert into prw_qq_mem (qq, nick, join_time,gender, card) values ('%s', '%s', '%s', '%s', '%s')" % ( qq, nick, join_time, gender, card) res = tools.op_mysql(mysql_info, sql) return json.dumps( {'msg:': '添加QQ成员信息成功!', 'qq': qq, 'nick': nick, 'join_time': '%s' % tools.TimeStampToStr(int(join_time)), 'gender': gender, 'card': card}, ensure_ascii=False) else: return json.dumps({'msg:': '请输入qq、nick、join_time'}, ensure_ascii=False) else: return json.dumps({'msg:': '未登录'}, ensure_ascii=False) # 最后是主程序,在工程文件夹的根目录 main.py,开始运行整个程序直接运行main即可 from lib import interface from config.setting import server_info import sys, os BASE_PATH = os.path.dirname(os.path.abspath(__file__)) # 获取父目录,__file__ 获取当前文件绝对位置 sys.path.insert(0,BASE_PATH) # 将工程文件目录加入环境变量,位置0,即可实现import此文件夹下面 config、lib 文件夹里面各模块 # print(sys.path) interface.server.run(**server_info)