PKW: flask 接收请求参数 + pandas groupby 实用(第 2 期)

2019-07-17 16:02:44 浏览数 (1)

这是 Python Knowledge Weekly(PKW)第 2 期。

”有时候就是要经历一些糟糕的事情才能意识到世间存在的美丽。 Sometimes it takes going through something so awful to realize the beauty that is out there in this world.“

点点滴滴,不忘初心。

本周分析知识

一、flask 接收 get 请求参数处理

二、pandas groupby 的简单实用

flask 接收 get 请求参数处理

缘起

在最近的工作中,需要做一些接口测试,在使用 requests 写接口测试用例,因为具体的业务实现还没有搭建好,所以自己就现在本地使用 flask 搭建了一个服务,用来模拟业务的正常请求和相应。然后写完一个接口的正常测试用例后,就用本地的服务来测试下,看看能否调通。

问题

有这么一个 get 接口,http://127.0.0.1/test?schema-name=public,使用 requests 来模拟请求,因为还要兼容 post 类的接口测试,所以这里代码书写如下:

代码语言:javascript复制
1import requests
2
3url = 'http://127.0.0.1:5000/test/'
4args = {'json': {'schema-name': 'new'}}
5resp_obj = requests.request(url=url, method='GET', **args)
6print(resp_obj.url)
7print(resp_obj)

开始 flask 服务端代码如下:

代码语言:javascript复制
 1@app.route("/test", methods=['GET', 'POST'])
 2def test():
 3    schemaname = request.args.get('schema-name')
 4    jsonstr = [
 5  {
 6    "name": "test1",
 7    "schema": schemaname,
 8    "type": "TABLE"
 9  },
10  {
11    "name": "test2",
12    "schema": schemaname,
13    "type": "TABLE"
14  }
15]
16
17    print(jsonstr)
18    return jsonify(jsonstr), 200
测试

发现,用浏览器输入 http://127.0.0.1:5000/test?schema-name=public,是可以正常获取到参数的,但是用 requests 发请求,确没法正常接收参数。

改变接收方式

多次尝试未果后,开始尝试通过 get_json() 来接收 requests 的请求

代码语言:javascript复制
 1@app.route("/test", methods=['GET', 'POST'])
 2def test():
 3    # schemaname = request.args.get('schema-name')
 4    schemaname = request.get_json()['schema-name']
 5    jsonstr = [
 6  {
 7    "name": "test1",
 8    "schema": schemaname,
 9    "type": "TABLE"
10  },
11  {
12    "name": "test2",
13    "schema": schemaname,
14    "type": "TABLE"
15  }
16]
17
18    print(jsonstr)
19    return jsonify(jsonstr), 200

发现可以正常接收 request 的请求了。 总结下来就是,args 只能够接收地址栏中的参数,对于通过 body 传过来的,是无能为力的。

pandas groupby 的简单实用

其实 pandas 的 groupby 是一个非常完善且强大的功能,我这里也只是因为用到了,才简单入门学习了下,其实仅仅使用到了 groupby 之后的数据获取。 我这里的需求是,有如下的数据,我想把“分组”和“英雄名字”两列提取出来,以“分组”列进行分组,然后把同一组的英雄组合到一起,最后用饼图展示。数据格式如下:

最开始的时候,因为对 pandas 不是很熟悉,走了很多弯路,尝试了很多办法都没法实现,然后就到官网上查看 groupby 的用法,看到了如下图的一段例子,感觉还是可以应用到我这个需求当中的,于是就尝试了下,还真的成了。

最后的完整代码如下:

代码语言:javascript复制
 1df = data[['分组', '英雄名字']]  # 获取需要的两列
 2
 3grouped = df.groupby(['分组'])  # 以”分组“列来进行分组
 4k = []
 5
 6# 获取分组后的 组和值,保存为字典,放到列表中
 7for name, group in grouped:
 8    k.append({name: list(group['英雄名字'].values)})
 9
10kk = []
11for i in k:
12    for k, v in i.items():
13        kk.append(v)
14
15length = []
16key = []
17for i in kk:
18    key.append(str(i))
19    length.append(len(i))
20
21pie = Pie('英雄初始属性分类图', title_pos='center')
22pie.add("", key, length,
23        is_label_show=True, legend_pos="bottom", legend_orient="vertical",)
24pie.render()

其实现在再看看,代码写的还是挺菜的,但是毕竟暂时解决了我的问题,后面可能还是优化下,毕竟保存的分组信息是没有用到的。 也欢迎有兴趣的小伙伴儿来一同优化下啦。

0 人点赞