python自动化测试-D6-学习笔记之三(如何开发接口)

开发接口需要安装flask,是一个web的框架


'''怎么开发接口
mock
1、暂时代替第三方接口
2、辅助测试,用来代替没有开发好的接口
3、查看数据
4、flask是一个web的开发框架'''
'''
写代码都要有目录层级,一个程序一般有以下几个目录
bin 是运行的python文件 start.py 是程序的入口 这个时候,需要通过import来导入python文件,由于我们导入的文件分布在不同目录下,
import导入的逻辑是先找同目录下的文件,同目录下的没有的话,从环境变量里找,由于目录分布太多,不可能一一加到环境变量里,
所以我们先把bin的父目录加到环境变量里
BASE_PATH=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # __file__ 代表当前文件,这个是用来取父目录的,套两层是为了取到api的目录,abspath是为了让路径分隔符一致
sys.path.insert(0,BASE_PATH) # sys.path是环境变量地址 0是位置,把base_path加到环境变量里
后面所有要调用自己写的python文件,都要写成如下格式:
from lib.XXX import 方法名或者其他
from confing import setting

lib 存放的是代码文件,写的是各个代码的逻辑
conf 放置配置文件,里面建立一个setting.py存配置文件
data
logs
readme.md 是存放程序说明的东西

'''
import flask,json
from tools import op_mysql #用这种方式导入的话,使用的时候,写成op_mysql(sql)
# import tools #这种方式导入的话,使用的时候,需要写成 tools.op_mysql(sql)
app_server = flask.Flask(__name__)# __name__ 代表这个python文件名字,app_server的意思是把app.py的文件作为一个server服务

# 获取表里所有数据的接口
# @app_server.route是装饰器,意味着下面的函数不是一个普通的函数了,已经变成了接口了
# 'get_user'是http://127.0.0.1:8080/ 后面的地址,methods指的是请求方式是get还是post

@app_server.route('/get_user',methods=['get','post'])

def get_all_user():
sql = "select * from bt_stu;"
res = op_mysql(sql)
return res #return的时候只能return一个字符串

@app_server.route('/add_user',methods=['post'])

def add_user(): #这里面不能在写参数了

user_id = flask.request.values.get('id') #这里的参数就是调用接口的时候传入的参数
username = flask.request.values.get('name')

if username and user_id:
sql = "insert into stu VALUES ('%s','%s')"%(user_id,username)
res = op_mysql(sql)
response = {'code':'308','msg':'添加成功'}
else:
response = {'code':'503','msg':'必填参数未填写'}
return json.dumps(response,ensure_ascii=False)

app_server.run(port=8080,debug = True)

开发接口的目录结构如下:
bin -start.py 写的是运行python的文件
lib - main.py 写的是接口的主要逻辑 ,例如上面的 get_user的接口 就放在main里。其他文件是main需要调用的模块

 

因为pycharm没有那么智能,启动服务之前要在pycharm中把api加到环境变量里,见下图

如果不加到环境变量里,pycharm认不出来导入的包,就会提示错误,如下图的 from lib.…… 其中lib就画红线了


 


补充:装饰器,生成器。老师博客内容,如下:

一、装饰器

装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面每个函数都加一个功能,用来统计每个函数的运行时间是多少,找出来运行比较慢的函数,来优化代码,就需要添加一个新的功能,来统计程序的运行时间,那这样的话,就得修改每个函数了,需要改代码,但是代码特别多,改完了公司倒闭了,这时候装饰器就能排上用场了,它可以不改变原有的函数,原来的函数和原来一模一样,什么都不需要改变,只需要在函数外部加上调用哪个装饰器就可以了。so,装饰器的作用就是不改变原来函数的调用方式,不改变原来函数的代码,给它增加了一个新功能。但是不改变函数,给它增加新功能,那是不可能的,装饰器只不过是偷偷改变了原来的函数而已,而原来的函数不知不觉。

使用装饰器需要了解的知识:

1、函数即变量,这个是什么意思呢,在python里面函数就是一个变量,函数名就是一个变量,这个函数名里面存的是这个函数的内存地址,它把函数体放到内存里,在调用的时候从函数名里面的这个内存地址找到函数体然后运行这个函数。前面的博客说函数的时候,说过函数名后面加上小括号就是调用这个函数,如果只写这个函数名的话,打印一下就是这个函数的内存地址。

运行结果:

2、高阶函数,高阶函数在上篇博客里面写了,如果函数的入参是一个函数的话,那么这个函数就是一个高阶函数。

3、函数嵌套,函数嵌套,函数嵌套就是在函数里面再定义一个函数,这就是函数嵌套,而不是说在函数里面再调用一个函数。

了解了上面的这些知识之后,就可以使用装饰器了,下面我写一个简单的装饰器,用来统计函数的运行时间,然后将被统计的函数作为参数传递

运行结果:

但是这样的话,我们每次都要将一个函数作为参数传递给test1函数。改变了函数调用方式,之前执行业务逻辑时,执行运行bar(),但是现在不得不改成test1(bar)。此时就要用到装饰器。我们就来想想办法不修改调用的代码;如果不修改调用代码,也就意味着调用bar()需要产生调用test1(bar)的效果。我们可以想到将test1赋值给bar,但是test1似乎带有一个参数……想办法把参数统一吧!如果test1(bar)不是直接产生调用效果,而是返回一个与foo参数列表一致的函数的话……就很好办了,将test1(bar)的返回值赋值给bar,然后,调用bar()的代码完全不用修改!

运行结果:

函数timmer就是装饰器,它把执行真正业务方法的func包裹在函数里面,看起来像bar被timmer装饰了。如果我们要定义函数时使用装饰器,避免使用赋值语句bar=timmer(bar),要用到装饰器的语法糖@,语法糖的意思就是一种语法的简写,它使代码看起来简洁,上面的bar=timmer(bar)和@timmter bar()是一样的。这样写的话,看起来也比较高大上一些。

运行结果:

这样,我们就提高了程序的可重复利用性,当其他函数需要调用装饰器时,可以直接调用。装饰器在Python使用如此方便都要归因于Python的函数能像普通的对象一样能作为参数传递给其他函数,可以被赋值给其他变量,可以作为返回值,可以被定义在另外一个函数内。

如果要装饰的函数带有参数时,因为你也不知道到底被装饰的函数会传什么参数,所以可以使用可变参数和关键字参数来接收所有的参数,这两种参数也在上一篇博客中写过了。代码如下:

运行结果:

下面再用装饰器,写一个实例,判断用户是否登陆,逻辑是这样,运行程序,打印菜单,如果是选择后台管理和添加商品,就判断用户是否登录,如果没有登录的话,让用户登录,如果是查看商品就不需要登录。

二、生成器

生成器是什么东西呢,可以理解为,生成器也是一个迭代的对象,和list似的,里面存数据,和list不同的是,list在定义的时候数据就已经在内存里面了,而生成器是,你用到这个里面的数据的时候它才会生成,这样就比较省内存,因为是需要这个值的时候,才会在内存里面产生。生成器是按照某种规则生成的一个列表,用到这个列表的中的数据时,才会在内存里生成,但是由于生成器是根据某种规则产生的,必须得知道前一个值是多少,才能知道后面的那个值是多少,所以不能像list那样,直接用索引去取值。

1、 列表生成式,在第二篇博客里面我写了三元运算符,和那个有点像,如果要生成列表[1x1, 2x2, 3x3, ..., 10x10]怎么做?除了循环还可以用一行语句代替循环生成

这种写法就是Python的列表生成式,写列表生成式时,把要生成的元素 x * x 放到前面,后面跟 for 循环,就可以把list创建出来。

2、生成器:要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator。

创建list和generator的区别仅在于最外层的[]和()。list的元素我们可以一个个打印出,如果要打印generator中的元素需要借助next方法

运行结果:

但是generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。可以通过for循环来迭代它,并且不需要关心StopIteration的错误。

运行结果:

用函数生成generator:generator非常强大。如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。例如,斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:

运行结果:

上面的函数和generator仅一步之遥。要把fib函数变成generator,只需要把print(b)改为yield b就可以了:

三、内置函数








posted on 2018-01-24 18:37  爱睡觉的加菲猫  阅读(287)  评论(0编辑  收藏  举报

导航