一、开发接口的作用
1.mock接口,模拟一些接口,在别的接口没有开发好的时候,需要开发一些模拟接口进行调试和测试。
2.查看数据,比如,获取所有学员信息的接口,就不需要提供数据库的查看信息。
二、接口开发
1.在接口开发前,需先安装flask模块,它是一个轻量级的web开发框架。pip install flask
先写个简单的接口来热热身吧。。。。
import flask,json
# __name__,代表当前这个python文件=#把咱们当前这个python文件,当做一个服务8000/index?param
@server.route('/index',methods=['get'])#methods是指接口支持哪种请求方式,不写的话默认是get请求= {'msg':'这是我开发的第一个接口','msg_code':0}
return json.dumps(res,ensure_ascii=False)
#默认端口号是5000,可以在这里自己设定
#debug=True是指在在改动代码后服务会自动帮你重启
#host=0.0.0.0表示别人访问的时候,用你的ip就可以访问了=8000,debug=True,host='0.0.0.0')#启动服务
运行这段代码,然后在浏览器输入http://localhost:8000/index就可以看到自己开发的第一个接口了
import flask,os
server =#把当前这个python文件做为一个服务'/error',methods=['get']) #路由= flask.request.values.get('cmd') #接口的入参= 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')#接收用户的数据= 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
启动该服务后,可用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 的配置参数= {
'host': '127.0.0.1',
'password': 'HK139bc&*',
'port': 6379,
'db': 14 # redis 配置参数= 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 # 传入sql语句,操作数据库= pymysql.connect( **MYSQL_INFO)
cur = conn.cursor()
cur.execute(sql)
if sql.strip()[:6].upper() == 'SELECT':
res = # 获取数据库的数据
else:
conn.commit() # 除select语句外的其他语句= 'OK'
cur.close()
conn.close()
return res
def op_redis(k, v=None, seconds=None): # 操作redis,如果只传入key,则获取value,
# 如果传入key, value,将key,value写入redis,如果三个参数都有,则写入redis,有时限= 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
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 #密码不为空,说明用户是存在的,再校验用户密码是否输入正确
if my_md5(pwd)==password: #用户密码输入正确,再校验用户是否已经登录过= 'session:%s' % username
if #若session_key存在,说明用户登录过,返回用户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
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里测试自己所写的接口了