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

原文出处 http://xugaoxiang.com/post/120

软硬件环境

  • ubuntu 16.04 64bit
  • python3
  • flask

问题描述

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

代码实践

具体可以看看行间注释

# -*- coding: utf-8 -*-
# @Time    : 18-4-17 下午4:15
# @Author  : xugaoxiang
# @Email   : [email protected]
# @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

猜你喜欢

转载自blog.csdn.net/djstavav/article/details/79981321