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

/

软硬件环境

  • ubuntu 16.04 64bit
  • python3
  • flask

问题描述

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

代码实践

具体可以看看行间注释

  1. # -*- coding: utf-8 -*-
  2. # @Time : 18-4-17 下午4:15
  3. # @Author : xugaoxiang
  4. # @Email : [email protected]
  5. # @Website : http://www.xugaoxiang.com
  6. # @File : test.py
  7. # @Software: PyCharm
  8. import os
  9. import time
  10. from flask import Flask, request
  11. from werkzeug.utils import secure_filename
  12. from concurrent.futures import ThreadPoolExecutor
  13. flask_app = Flask(__name__)
  14. # 能接收的图片文件大小
  15. flask_app.config['MAX_CONTENT_LENGTH'] = 2 * 1024 * 1024
  16. # 同时处理的最大线程数
  17. executor = ThreadPoolExecutor(10)
  18. # 能接收的文件后缀名
  19. ALLOWED_EXTENSIONS = set(['png','jpg','jpeg'])
  20. def allowed_file(filename):
  21. return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
  22. # 只能接收POST方法
  23. @flask_app.route('/uploadImageFile', methods=['POST'])
  24. def uploadImageFile():
  25. '''
  26. HTTP POST, 接收发送过来的图片数据
  27. :return:
  28. '''
  29. # multipart/form-data file --> key
  30. file = request.files['longjing']
  31. if file and allowed_file(file.filename):
  32. filename = secure_filename(file.filename)
  33. if not os.path.exists('temp'):
  34. os.mkdir('temp')
  35. file.save(os.path.join('temp', filename))
  36. # 上传的是空文件
  37. if os.stat(os.path.join('temp', filename)).st_size == 0:
  38. os.remove(os.path.join('temp', filename))
  39. return 'Empty image file.'
  40. # 异步任务
  41. executor.submit(do_job, filename)
  42. # 直接返回
  43. return 'POST success.'
  44. else:
  45. return "POST failed."
  46. def do_job(filename):
  47. '''
  48. 模拟的异步任务
  49. :param filename:
  50. :return:
  51. '''
  52. print('start do_job, file={}'.format(filename))
  53. time.sleep(10)
  54. print('finish do_job')
  55. if __name__ == '__main__':
  56. flask_app.run(host='0.0.0.0', port=8889)

使用Postman来模拟POST操作

参考资料

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

转载请注明作者和出处,并添加本页链接。
原文链接: http://xugaoxiang.com/post/120

给我留言