封装Falsk接口

封装flask接口实际上就是封装一个flask视图函数,后台通过请求指定路由就可以与接口进行通信。

以下是一个flask接口示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from flask import Flask, request
from genvent import pywsgi

app = Flask(__name__) # 注册一个app

@app.route('/test', methods=['post', 'get']) # '/test'是访问路径, methods指定了请求的方法
def test():
data = request.get_json()['data'] # 通过request获取传来的数据
return data # 对请求返回响应

if __name__ == '__main__':
# 开启wsgi服务,模拟flask框架的服务
server = pywsgi.WSGIServer(('127.0.0.1:8802', 8802), app)
server.server_forever()

注意:flask视图函数的返回值类型只能为:string, dict, tuple, Response instance, or WSGI callable

我们用requests来向接口发起请求:

1
2
3
4
import requests

r = requests.post('127.0.0.1:8802/test', data={'data':'hello world'})
print(r.text) # 输出 hello world

接下来,我们看看flask接口接收数据都有哪些方法。

Tables Are 结果
request.form 获取参数字典
request.form.get(键) 获取字典中键的值
request.args.getlist(键) 获取字典中键的值
request.files 接收文件字典
request.files.get(键) 获取文件字典中的内容
文件对象=request.files.get(键) 文件对象.save(保存路径) 保存文件到本地,方式一
with open(路径,’wb’) as f:内容 = 文件对象.read()f.write(内容) 保存文件到地址,方式二
文件对象.name 文件对象.content_length 文件的名字与大小
flask.request.method 请求方式 GET/POST
flask.get_data() 获取post参数 注:如果是form表单提交的POST数据请使用request.form
args = request.get_json() 获取postjson参数 get_json() 会自动将json数据转换为字符串,还有POST请求需要设置请求头发送参数为application/json格式,才可以接收到。如果没有设置成json格式发送,请使用get_data接收参数

实例1

通过requests以numpy的ndarry形式向接口发送图片文件,接口接收文件并展示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 接口文件

from flask import Flask, request, jsonify
from gevent import pywsgi
import cv2
import numpy as np
import json

app = Flask(__name__)

@app.route('/file', methods=['get', 'post'])
def loadFile():
data = request.get_json()['data']
picture = json.loads(data)['picture']
file = np.array(picture, dtype=np.uint8) # 对于图片,必须设置dtype为uint8
cv2.imshow('xxx', file)
cv2.waitKey(5000)
cv2.destroyAllWindows()
return jsonify({'data':'success'})

if __name__ == '__main__':
# 通过wsgi开启服务
server = pywsgi.WSGIServer(('127.0.0.1', 8802), app)
server.serve_forever()
1
2
3
4
5
6
7
8
9
10
11
12
# 请求文件

import requests
import cv2
import numpy as np
import json

img = cv2.imread('2.jpg')
img_dict = {'picture':img.tolist()} # 将ndarray数组转换为列表,加入字典中
img_json = json.dumps(img_dict) # 将字典转换为json
x = requests.post('http://127.0.0.1:8802/file', json={"data":img_json}) # {'data': {'picture':'[...]'}}
print(x.json()['data']) # 输出success

实例2

通过requests以二进制的形式向接口发送图片文件,接口接收文件并保存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 接口文件

from flask import Flask, request
from gevent import pywsgi

app = Flask(__name__)

@app.route('/file', methods=['get', 'post'])
def loadFile():
data = request.files
for name, file in data.items():
file.save(name)

if __name__ == '__main__':
# 通过wsgi开启服务
server = pywsgi.WSGIServer(('127.0.0.1', 8802), app)
server.serve_forever()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 请求文件

import requests

# (1)单张图片:
requests.post('http://127.0.0.1:8802/file', file=open('x.jpg', 'rb')) # 以二进制只读方式打开


# (2)多张图片:
dic = {}
# 遍历文件夹
dirs = os.listdirs('data')
for dir in dirs:
# 拼接路径
path = 'data' + '/' + dir
# 构建字典,以图片名称作为键
dic[dir] = open(path, 'rb')
requests.post(url, file=dic)