python学习笔记(十三)接口开发
一、开发接口的作用
1.mock接口,模拟一些接口,在别的接口没有开发好的时候,需要开发一些模拟接口进行调试和测试。
2.查看数据,比如,获取所有学员信息的接口,就不需要提供数据库的查看信息。
二、接口开发
1.在接口开发前,需先安装flask模块,它是一个轻量级的web开发框架。pip install flask
先写个简单的接口来热热身吧。。。。
import flask,json
# __name__,代表当前这个python文件
server = flask.Flask(__name__)#把咱们当前这个python文件,当做一个服务 #ip:/index?param
@server.route('/index',methods=['get'])#methods是指接口支持哪种请求方式,不写的话默认是get请求
def index():
res = {'msg':'这是我开发的第一个接口','msg_code':}
return json.dumps(res,ensure_ascii=False) #默认端口号是5000,可以在这里自己设定
#debug=True是指在在改动代码后服务会自动帮你重启
#host=0.0.0.0表示别人访问的时候,用你的ip就可以访问了
server.run(port=,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=,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': }
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': }
else:
res = {'msg':'必填字段未填,请查看接口文档!','msg_code':}
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- -*-
MYSQL_INFO = {
'host': '127.0.0.1',
'user': 'root',
'password': '',
'db': 'test',
'port': ,
'charset': 'utf8'
} # MySQL 的配置参数 REDIS_INFO = {
'host': '127.0.0.1',
'password': 'HK139bc&*',
'port': ,
'db':
} # redis 配置参数 SERVER_PORT = # 服务端端口
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()[:].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':}
else:
op_redis(user_key,my_md5(pwd))
res = {'msg': '注册成功!', 'msg_code': }
else:
res = {'msg': '必填字段未填,请查看接口文档!', 'msg_code': }
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),) #用户没登录过,插入用户session和登录时间
else:
res = {'msg': '密码错误!', 'msg_code': }
else:
res = {'msg': '用户不存在!', 'msg_code': }
else:
res = {'msg': '必填字段未填,请查看接口文档!', 'msg_code': }
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里测试自己所写的接口了
python学习笔记(十三)接口开发的更多相关文章
- python学习笔记:接口开发——PythonWEB框架之Flask
Flask是一个使用 Python 编写的轻量级 Web 应用框架,安装命令如下 pip install flask 一.服务端接口是怎么开发的? 1.启动一个服务 2.接收到客户端传过来的数据3.登 ...
- python学习笔记:接口开发——flask Demo实例
举例1,返回当前时间接口 ''' 初始化:所有的Flask都必须创建程序实例, web服务器使用wsgi协议,把客户端所有的请求都转发给这个程序实例 程序实例是Flask的对象,一般情况下用如下方法实 ...
- python使用笔记22--mock接口开发
1.mock接口开发 mock是模拟一个接口的意思 为了不阻止测试,开发一个接口,返回你想要的数据,模拟各种场景 需要安装第三方模块flask,flask是web轻量级开发框架 1.1 flask p ...
- python 学习笔记十三 JQuery(进阶篇)
jQuery 是一个 JavaScript 库. jQuery 极大地简化了 JavaScript 编程. 安装jQuery 有两个版本的 jQuery 可供下载: Production versio ...
- python学习之flask接口开发,环境变量扩展,网络编程requests
python基础 flask之mock接口 所谓mock接口,其实就是我们在正式接口还没联调或者是测试接口没有正式使用时,自己创建一个模拟接口,来供项目暂时打通功能或者测试流程梳理的桥梁,而我们这儿使 ...
- python学习笔记十三 JS,Dom(进阶篇)
JS介绍 JavaScript 是属于网络的脚本语言!JavaScript 被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies,以及更多的应用:JavaScript 是因特网上最流 ...
- python学习笔记(接口自动化框架 V2.0)
这个是根据上次框架版本进行的优化 用python获取excel文件中测试用例数据 通过requets测试接口.并使用正则表达式验证响应信息内容 生成xml文件测试报告 版本更新内容: 1. 整理了Cr ...
- python学习笔记(接口自动化框架 V1.0)
之前是利用python自带的unittest测试框架 这次自己设计一个 之后再一点点往里面加功能 (ps:当然这个框架真的是很简单..很简单...很简单...) excel文件格式: #!/usr/b ...
- Python学习笔记_Chapter 7web开发
1.web应用元素 a.成员: web浏览器 web服务器 b.行为: web请求: 请求内容: 静态内容:如html文件,图像. 动态内容:需服务器运行一个程序进而做出响应. 网关接口&CG ...
随机推荐
- 一个通用的JavaScript分页
1.JavaScript代码 Pagination=function(id) { var totalNum=0; var maxNum=10; var pageUrl=""; va ...
- 【转】伪O2O已死?2016年实体零售将迎来真正的O2O
O2O果真如所谓的经济学家许小年所说“是两边都是零,中间一个2货”吗?我觉得,经济学家不是说相声的,这种哗众取宠的观点不应该出自一个严谨的经济学家之口.而且,我也不认为许小年真正懂什么叫O2O. 但O ...
- heartbeat 心跳技术
转自:http://blog.csdn.net/keda8997110/article/details/8349049 heartbeat 心跳技术原理: heartbeat (Linux-HA)的工 ...
- PHP时间戳 strtotime()使用方法和技巧
在php中我想要获取时间戳有多种方法,最常用的就是使用time函数与strtotime()函数把日期转换成时间戳了, 下面我来给大家分享一下时间戳函数 strtotime用法. 获取指定的年月日转化为 ...
- php如何判断两个时间的时间差
$time1=2011-11-11 11:11:11$time2=2016-12-10 16:58:13 代码: if(abs(strtotime($time2)-strtotime($time1)) ...
- poj 1090:The Circumference of the Circle(计算几何,求三角形外心)
The Circumference of the Circle Time Limit: 2 Seconds Memory Limit: 65536 KB To calculate the c ...
- [转]VC++下使用ADO操作数据库
(1).引入ADO类 1 2 3 #import "c:program filescommon filessystemadomsado15.dll" no_namespace re ...
- ASP.NET MVC - The view must derive from WebViewPage, or WebViewPage<TModel>
当通过一个空的站点构建ASP.NET MVC时经常会出现各种配置缺少的问题,最简单但的办法是吧VS自动生成的web.config文件拷贝到对应的目录下面 The view must derive fr ...
- Hive将txt、csv等文本文件导入hive表
1.将txt文本文件放置hdfs目录下 2.登录hive并进入到指定数据库 3.创建表 create external table if not exists fun_user_external ( ...
- Python学习笔记5-元组Tuple
tuple和list非常类似,但是tuple一旦初始化就不能修改,它也没有append(),insert()这样的方法.其他获取元素的方法和list是一样的 元组是用圆括号括起来的,其中的元素之间用逗 ...