跟牛牛老师学习python自动化的第七天
接口开发
先安装一个模块:pip install flask 用它来启动一个服务,flask是一个web框架
1、知道接口是怎么开发的
2、避免别人操作你的数据库
3、mock服务(模拟一个服务)
一个简单的接口:
1 import flask 2 server = flask.Flask(__name__)#把当前这个python文件当做一个服务 3 @server.route('/login',methods=['get','post'])#装饰器 4 def zjr(): 5 return '登录成功!' 6 server.run(port=8989,debug=True)#启动服务,端口号为8989,修改后自动重启
启动后:
重新运行只能启动一个,否则端口号会重复,点击服务网址,加域名(http://127.0.0.1:8989/login)
访问服务:http://127.0.0.1:8989/login
用postman访问接口
写死的参数:
1 import flask 2 import json 3 server = flask.Flask(__name__)#把当前这个python文件当做一个服务 4 @server.route('/login',methods=['get','post'])#装饰器 5 def zjr(): 6 res = {'code':1000,'msg':'登录成功!','sign':'sbhjsgurhuheuih'}#创建了一个字典 7 return json.dumps(res,ensure_ascii=False)#不能直接返回字典,需要用json.dumps转成json串 8 #ensure_ascii=False加这个参数,可以返回中文 9 server.run(port=8989,debug=True)#启动服务,端口号为8989,修改后自动重启
用postman传参(k-v):
1 import flask 2 import json 3 server = flask.Flask(__name__)#把当前这个python文件当做一个服务 4 @server.route('/login',methods=['get','post'])#装饰器,下面的函数不是普通的函数而是个接口
5 def zjr(): 6 username = flask.request.values.get('username')#是从客户端发过来的数据 7 pwd = flask.request.values.get('password') 8 if username=='zjr' and pwd == '123456': 9 res = {'code': 1000, 'msg': '登录成功!', 'sign': 'sbhjsgurhuheuih'} # 创建了一个字典 10 else: 11 res = {'code': 2000, 'msg': '账号/密码错误!'} # 创建了一个字典 12 return json.dumps(res,ensure_ascii=False)#不能直接返回字典,需要用json.dumps转成json串 13 #ensure_ascii=False加这个参数,可以返回中文 14 server.run(port=8989,debug=True)#启动服务,端口号为8989,修改后自动重启
json、cookie、headers传参:
1 json_data = flask.request.json.get()#'获取入参是json类型的'
2 flask.request.cookies.get('xxx')#获取cookie
3 flask.request.headers.get('xxx')#获取headers
用30行代码开发一个上传、下载文件的接口
分享一段代码,开发了3个接口:
1、上传文件
2、查看所有文件
3、下载文件
使用python开发,需要安装flask模块,使用pip install flask安装即可,代码量特别少,就能实现,加上注释总共35行代码,特别的简单,代码如下:
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服务
自己写一个注册的接口
1 import flask,pymysql 2 import json,hashlib 3 server = flask.Flask(__name__)#把当前这个python文件当做一个服务 4 5 #操作数据库的函数 6 def my_db(sql,port=3306,charset='utf8'): 7 ip,user,passwd,db = '数据库ip','数据库用户','密码','数据库名字' 8 coon = pymysql.connect(host=ip,user=user, 9 password=passwd, 10 db = db, 11 port=port, 12 charset=charset, 13 autocommit=True 14 ) 15 cur = coon.cursor() 16 sql=sql.strip() 17 cur.execute(sql) 18 sql_start = sql[:6].lower()#取SQL的开头6位,转换成小写 19 if sql.startswith('select') or sql.startswith('show'): 20 data = cur.fetchall() 21 else: 22 data ='ok' 23 cur.close() 24 coon.close() 25 return data 26 27 #MD5加密函数 28 def my_md5(s): 29 m = hashlib.md5(s.encode()) 30 return m.hexdigest() 31 32 @server.route('/register',methods=['post']) 33 def reg(): 34 username = flask.request.values.get("username") # 是从客户端发过来的数据 35 passwd = flask.request.values.get("passwd") 36 cpasswd = flask.request.values.get("cpasswd") 37 if username and passwd and cpasswd: 38 sql1 = 'select * from nhy where name="%s";'%username#数据库里是双引号“” 39 sql_res = my_db(sql1) 40 if sql_res: 41 res = {'code':2001,'msg':'该用户已经被注册'} 42 else: 43 if passwd==cpasswd: 44 md5_pwd = my_md5(passwd) 45 sql2='insert into nhy(name,pwd) value("%s","%s");'%(username,md5_pwd) 46 my_db(sql2) 47 res = {'code':1000,'msg':'注册成功!'} 48 else: 49 res = {'code': 20003, 'msg': '两次密码不一致!'} 50 else: 51 res = {'code':20002,'msg':'必填参数未填,请查看接口文档!'} 52 return json.dumps(res,ensure_ascii=False) 53 54 server.run(port=8989,debug=True)#启动服务,接口写完了启动一次;debug=True是修改代码后自动重启
把项目分文件夹
将文件夹导入环境变量
操作excel
1.读excel
1 import xlrd#只能读 2 book = xlrd.open_workbook('zjr.xls') 3 print(book.nsheets)#excel里一共有多少sheet页 4 sheet = book.sheet_by_index(0)#sheet页的索引 5 # book.sheet_by_name('sheet1')#sheet页的名字 6 print(sheet.cell(0,0).value)#不加.value会显示数据的类型 7 print(sheet.cell(1,0))#显示第二行第一列的数据,不加.value会显示数据的类型 8 print(sheet.row_values(0))#显示某一行的数据 9 print(sheet.row_values(1)) 10 print(sheet.nrows)#这个Excel里总共有多少行 11 print(sheet.col_values(0))#某一列的数据 12 print(sheet.col_values(1)) 13 print(sheet.ncols)#总共有多少列
2.修改excel
1 import xlrd 2 from xlutils import copy#修改需要两个模块xlrd和xlutils 3 book1 = xlrd.open_workbook('zjr.xls')#打开原来的excel 4 new_book = copy.copy(book1)#拷贝一个新的excel 5 sheet = new_book.get_sheet(0)#获取一个sheet页 6 print(dir(sheet))#查看sheet有什么方法 7 sheet.write(1,3,'88')#第二行的第四列 8 sheet.write(1,1,'周继蓉') 9 new_book.save('zjr.xls') 10 #一定先关掉zjr.xls文件
3.写excel
1 import xlwt 2 book = xlwt.Workbook()#创建excel 3 sheet = book.add_sheet('stu_info')#加一个sheet页 4 sheet.write(0,0,'学生编号')#行、列 5 sheet.write(0,1,'学生姓名')#第一行、第二列 6 sheet.write(0,2,'成绩')#第一行、第二列 7 sheet.write(1,0,'1')#行、列 8 sheet.write(1,1,'周继蓉')#行、列 9 sheet.write(1,2,89)#行、列 10 book.save('stu.xls')#一定要用xls的
结果: