python学习笔记(十三)接口开发
一、开发接口的作用
1.mock接口,模拟一些接口,在别的接口没有开发好的时候,需要开发一些模拟接口进行调试和测试。
2.查看数据,比如,获取所有学员信息的接口,就不需要提供数据库的查看信息。
二、接口开发
1.在接口开发前,需先安装flask模块,它是一个轻量级的web开发框架。pip install flask
先写个简单的接口来热热身吧。。。。
import flask,json # __name__,代表当前这个python文件 server = flask.Flask(__name__)#把咱们当前这个python文件,当做一个服务 #ip:8000/index?param @server.route('/index',methods=['get'])#methods是指接口支持哪种请求方式,不写的话默认是get请求 def index(): res = {'msg':'这是我开发的第一个接口','msg_code':0} return json.dumps(res,ensure_ascii=False) #默认端口号是5000,可以在这里自己设定 #debug=True是指在在改动代码后服务会自动帮你重启 #host=0.0.0.0表示别人访问的时候,用你的ip就可以访问了 server.run(port=8000,debug=True,host='0.0.0.0')#启动服务
运行这段代码,然后在浏览器输入http://localhost:8000/index就可以看到自己开发的第一个接口了
import flask,os server = flask.Flask(__name__) #把当前这个python文件做为一个服务 @server.route('/error',methods=['get']) #路由 def cmd(): cmd = flask.request.values.get('cmd') #接口的入参 res = os.popen(cmd) return res.read() server.run(host='0.0.0.0',port=8999,debug=True)
浏览器里输入http://localhost:8999/error?cmd=ipconfig获取到执行命令的结果
2.再开发一个与数据有交互的的post请求的接口,需要对数据库进行操作,在这里直接引用之前写好的my_db()函数。
@server.route('reg',methods=['post']) def reg(): username = flask.request.values.get('username')#接收用户的数据 pwd = flask.request.values.get('passwd')#接收用户数据 if username and pwd: sql = 'select * from my_user where username = "%s"'%username if my_db(sql): res = {'msg': '该用户已注册', 'msg_code': 2001} else: insert_sql = 'insert into my_user(username,passwd,is_admin) VALUES ("%s","%s",0)'%(username,pwd) my_db(insert_sql) res = {'msg': '注册成功', 'msg_code': 0} else: res = {'msg':'必填字段未填,请查看接口文档!','msg_code':1001} return json.dumps(res,ensure_ascii=False)
启动该服务后,可用postman验证该接口,注意postman在测试post请求时,参数要写在body里
点击 send 就可以看到结果了
注意的一点是: server.run() 一定要放在所有接口的最底下运行,否则,在server.run()以下再开发接口,是检测不到的,不会被运行起来的
根据之前所学,总结起来说,以上写的接口只能叫做脚本,如果要实现一系列接口的开发,就需要把接口的配置、接口开发需要用到的工具、接口日志、接口需要的参数、数据初始化等等信息分门别类的列出来。
创建目录如下:
其中 bin 目录存放启动服务的python文件;
config存放配置参数,如mysql, redis的连接信息;
data文件存放sql语句,创建表格或者类似的东西,
lib 目录存放开发使用到的函数,即工具,还有开发好的接口也放在这里
logs 目录存放日志文件
READ_ME就是一个文档,类似说明书的一个作用
现在我们就按照以上的目录格局来进行接口开发
1、写一个注册接口:
1、写一个注册接口,让它的密码存成密文的。
2、数据存到redis或者mysql里面(开森就好),redis的key就用string类型(user:test1 7869d295e566295b51eec5d6bed67c14 )
3、test1 7869d295e566295b51eec5d6bed67c14
4、需要校验用户是否存在
2、登录接口
登录成功之后,返回seesionid,用户登录时间
sessionid
用户名+当前的时间戳 md5,seesion失效时间是60分钟
sessionid:test1
{"seessionid":a5dfcb047721e02a6f8bff779c815165,"login_time":201805051820}
如果这个用户已经登录过了,那么就返回他的seesionid,登录时间
思路分析:
1.在注册接口中会需要操作数据库,需要用到数据库的配置连接信息,我们可以将mysql和redis的连接信息统一写在config文件夹下的配置文件中,因此,我们在config文件下新建一个setting.py的文件,写入配置信息
#!/usr/bin/env python # -*- coding: utf-8 -*- MYSQL_INFO = { 'host': '127.0.0.1', 'user': 'root', 'password': '123456', 'db': 'test', 'port': 3306, 'charset': 'utf8' } # MySQL 的配置参数 REDIS_INFO = { 'host': '127.0.0.1', 'password': 'HK139bc&*', 'port': 6379, 'db': 14 } # redis 配置参数 SERVER_PORT = 8000 # 服务端端口
2.在实现接口过程中用到的函数,可以统一写在lib文件夹下面,我们创建一个tools.py的文件,定义需要用到的函数,例如:密码加密的函数my_md5(),redis操作函数op_redis(),mysql操作函数op_mysql()等等。
#!/usr/bin/env python # -*- coding: utf-8 -*- import pymysql, redis, hashlib, time from config.setting import MYSQL_INFO, REDIS_INFO def my_db(sql): # 传入sql语句,操作数据库 conn = pymysql.connect( **MYSQL_INFO) cur = conn.cursor() cur.execute(sql) if sql.strip()[:6].upper() == 'SELECT': res = cur.fetchall() # 获取数据库的数据 else: conn.commit() # 除select语句外的其他语句 res = 'OK' cur.close() conn.close() return res def op_redis(k, v=None, seconds=None): # 操作redis,如果只传入key,则获取value, # 如果传入key, value,将key,value写入redis,如果三个参数都有,则写入redis,有时限 r = redis.Redis( **REDIS_INFO) if v and seconds: r.setex(k, v, seconds) res = 'OK' elif v : r.set(k, v) res = 'OK' else: if r.get(k): res = r.get(k).decode() else: res = None return res def my_md5(s): md = hashlib.md5() md.update(s.encode()) res = md.hexdigest() return res
3.接下来进行接口代码编写,在lib里新建一个interface.py文件
@server.route('/my_reg',methods=['post']) def my_reg(): username = flask.request.values.get('username') # pwd = flask.request.values.get('passwd') if username and pwd: user_key='user:%s'%username if op_redis(user_key): res = {'msg':'用户已存在!','msg_code':2001} else: op_redis(user_key,my_md5(pwd)) res = {'msg': '注册成功!', 'msg_code': 0} else: res = {'msg': '必填字段未填,请查看接口文档!', 'msg_code': 1001} return json.dumps(res, ensure_ascii=False) @server.route('/my_login',methods=['post']) def my_login(): username = flask.request.values.get('username') # pwd = flask.request.values.get('passwd') if username and pwd: user_key = 'user:%s' % username password = op_redis(user_key) if password: #密码不为空,说明用户是存在的,再校验用户密码是否输入正确 if my_md5(pwd)==password: #用户密码输入正确,再校验用户是否已经登录过 session_key = 'session:%s' % username if op_redis(session_key): #若session_key存在,说明用户登录过,返回用户session session = op_redis(session_key) res = json.loads(session) else: sessionID = my_md5(username+str(int(time.time()))) login_time = time.strftime('%Y%m%d%H%M%S') res = {'sessionID':sessionID,'login_time':login_time} op_redis(session_key,json.dumps(res,ensure_ascii=False),3600) #用户没登录过,插入用户session和登录时间 else: res = {'msg': '密码错误!', 'msg_code': 2003} else: res = {'msg': '用户不存在!', 'msg_code': 2004} else: res = {'msg': '必填字段未填,请查看接口文档!', 'msg_code': 1001} return json.dumps(res, ensure_ascii=False)
4.这样,大部分工作就算完成了,最后在bin目录创建一个start的python文件,用来启动服务,代码如下
#!/usr/bin/env python # -*- coding: utf-8 -*- from lib.interface import server from config.setting import SERVER_PORT server.run( host='0.0.0.0', port= SERVER_PORT, debug=True )
5.以上,一个接口就算开发完了,可以看到,我们在文件里引用自己的python文件作为模块,这里需要在pycharm里设置一下,否则可能会报错,
设置步骤这样那样就完成了,如下图
点一下,就完成了,这个应该在最最最开始的时候就这样做了。。。。
6.这样运行此文件值需要启动start.py文件即可,然后就可在浏览器或postman里测试自己所写的接口了