徐高翔的个人网站

使用Flask框架异步处理POST请求

2017-08-20

软硬件环境

  • ubuntu 16.04 64bit
  • python3
  • flask

问题描述

在使用web框架flask的时候,经常需要提供HTTP POST接口来处理一些数据,而当多个客户端连接上来的时候,如何并行地处理这些任务经常困扰着我们,本文就来利用concurrent.futures来实现这个功能.

代码实践

具体可以看看行间注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# -*- coding: utf-8 -*-
# @Time : 18-4-17 下午4:15
# @Author : xugaoxiang
# @Email : djstava@gmail.com
# @Website : http://www.xugaoxiang.com
# @File : test.py
# @Software: PyCharm

import os
import time

from flask import Flask, request
from werkzeug.utils import secure_filename
from concurrent.futures import ThreadPoolExecutor

flask_app = Flask(__name__)

# 能接收的图片文件大小
flask_app.config['MAX_CONTENT_LENGTH'] = 2 * 1024 * 1024

# 同时处理的最大线程数
executor = ThreadPoolExecutor(10)

# 能接收的文件后缀名
ALLOWED_EXTENSIONS = set(['png','jpg','jpeg'])

def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS

# 只能接收POST方法
@flask_app.route('/uploadImageFile', methods=['POST'])
def uploadImageFile():

'''
HTTP POST, 接收发送过来的图片数据
:return:
'''

# multipart/form-data file --> key
file = request.files['longjing']
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
if not os.path.exists('temp'):
os.mkdir('temp')

file.save(os.path.join('temp', filename))

# 上传的是空文件
if os.stat(os.path.join('temp', filename)).st_size == 0:
os.remove(os.path.join('temp', filename))
return 'Empty image file.'

# 异步任务
executor.submit(do_job, filename)

# 直接返回
return 'POST success.'

else:
return "POST failed."

def do_job(filename):
'''
模拟的异步任务
:param filename:
:return:
'''

print('start do_job, file={}'.format(filename))
time.sleep(10)
print('finish do_job')

if __name__ == '__main__':

flask_app.run(host='0.0.0.0', port=8889)

使用Postman来模拟POST操作

参考资料

https://zhuanlan.zhihu.com/p/30897711

本文链接 https://xugaoxiang.com/2017/08/20/使用Flask框架异步处理POST请求/

推荐文章(由hexo文章推荐插件驱动)

使用支付宝打赏
使用微信打赏

请博主喝咖啡!