一、开发接口的作用

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学习笔记(十三)接口开发的更多相关文章

  1. python学习笔记:接口开发——PythonWEB框架之Flask

    Flask是一个使用 Python 编写的轻量级 Web 应用框架,安装命令如下 pip install flask 一.服务端接口是怎么开发的? 1.启动一个服务 2.接收到客户端传过来的数据3.登 ...

  2. python学习笔记:接口开发——flask Demo实例

    举例1,返回当前时间接口 ''' 初始化:所有的Flask都必须创建程序实例, web服务器使用wsgi协议,把客户端所有的请求都转发给这个程序实例 程序实例是Flask的对象,一般情况下用如下方法实 ...

  3. python使用笔记22--mock接口开发

    1.mock接口开发 mock是模拟一个接口的意思 为了不阻止测试,开发一个接口,返回你想要的数据,模拟各种场景 需要安装第三方模块flask,flask是web轻量级开发框架 1.1 flask p ...

  4. python 学习笔记十三 JQuery(进阶篇)

    jQuery 是一个 JavaScript 库. jQuery 极大地简化了 JavaScript 编程. 安装jQuery 有两个版本的 jQuery 可供下载: Production versio ...

  5. python学习之flask接口开发,环境变量扩展,网络编程requests

    python基础 flask之mock接口 所谓mock接口,其实就是我们在正式接口还没联调或者是测试接口没有正式使用时,自己创建一个模拟接口,来供项目暂时打通功能或者测试流程梳理的桥梁,而我们这儿使 ...

  6. python学习笔记十三 JS,Dom(进阶篇)

    JS介绍 JavaScript 是属于网络的脚本语言!JavaScript 被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies,以及更多的应用:JavaScript 是因特网上最流 ...

  7. python学习笔记(接口自动化框架 V2.0)

    这个是根据上次框架版本进行的优化 用python获取excel文件中测试用例数据 通过requets测试接口.并使用正则表达式验证响应信息内容 生成xml文件测试报告 版本更新内容: 1. 整理了Cr ...

  8. python学习笔记(接口自动化框架 V1.0)

    之前是利用python自带的unittest测试框架 这次自己设计一个 之后再一点点往里面加功能 (ps:当然这个框架真的是很简单..很简单...很简单...) excel文件格式: #!/usr/b ...

  9. Python学习笔记_Chapter 7web开发

    1.web应用元素 a.成员: web浏览器 web服务器 b.行为: web请求: 请求内容: 静态内容:如html文件,图像. 动态内容:需服务器运行一个程序进而做出响应. 网关接口&CG ...

随机推荐

  1. Java中float/double取值范围与精度

    Java浮点数 浮点数结构 要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个 ...

  2. git 删除分之以及删除文件夹

    1.删除分支 1.1查看所有分支: git branch -a 得到结果: 1.2删除HEAD分支 git push origin --delete HEAD 2.删除文件夹 2.1 查看本地分支下的 ...

  3. linux -- chcp

    mysql在控制台中,插入数据到数据库的某个表中,插入的数据中有中文,结果一直显示错误Incorrect string...,不能插入成功 猜测是编码格式不一致.可通过chcp命令修改控制台编码格式 ...

  4. bundle安装方法

    sudo chmod +x filename.bundle sudo ./filename .bundle 原文链接:http://www.chinastor.com/a/linux/ubuntu/0 ...

  5. mysql 分页sql

    -- pageSize=3 pageIndex total=7 -- 开始行号 startRowNum=(pageIndex-1)*pageSize+1; -- 结束行号 endRowNum=page ...

  6. (转)Spring AOP编程原理、Demo

    转自: http://pandonix.iteye.com/blog/336873/ AOP原理: http://blog.csdn.net/moreevan/article/details/1197 ...

  7. 搭建 Docker-Registry 私有仓库

    官方已经提供了很多版本的 Linux 镜像,直接从官方仓库(Public Repositories)下载就可以了.如果考虑到安全性和速度,我们可能会想在自己局域网里架设一个私有仓库(Private R ...

  8. 转:解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误

    操作SQL数据库,Python使用的是版本2.7,但是在运行的时候出现了异常错误UnicodeEncodeError:'ascii' codec can't encode characters in ...

  9. sql server函数(isnull,charindex,cast,自定义函数)

    SELECT charindex( CAST ( dbo.ufn_IsNullOrEmpty ('109722A3-622D-4FD4-A060-0287C933A89E', a.OUID) AS V ...

  10. 论坛模块_版块管理_增删改查&实现上下移动

    论坛模块_版块管理1_增删改查 设计实体Forum.java public class Forum { private Long id; private String name; private St ...