图片来自https://www.deviantart.com/eclectixx/art/Froste-Drake-Leather-Flask-374235622

软硬件环境

  • ubuntu 18.04 64bit
  • anaconda with python 3.6
  • flask
  • postman

前言

在使用flask框架进行web开发时,经常需要处理 POST 请求, 有的是客户发送过来的 json 格式的数据,有的时候则是文件,那么在服务端就需要flask能够处理这些请求,当然,答案也是肯定的。

flask处理上传文件

这里以接收图片为例

from flask import Flask, request
from werkzeug.utils import secure_filename

flask_app = Flask(__name__)
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg'])

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

@flask_app.route('/processPOSTFile', methods = ['POST'])
def processPOSTFile() :
    '''
    接收客户端post过来的图片
    :return:
    '''

    # multipart/form-data file --> key
    file = request.files['post']
    if file and allowed_file(file.filename) :
        filename = secure_filename(file.filename)

        file.save('test.jpg')
        return 'POST success.'
    else:
        return 'POST failed.'

我们可以使用 Postman 这个工具进行客户端行为的模拟。选择 Body 下的 form-data, key 值与 request.files['post']里的值保持一致Value 类型选择 File

flask_json_file_02

flask处理上传的json信息

假定上传的数据格式为

{"name":"xugaoxiang", "website":"https://xugaoxiang.com"}

flask端可以这样实现

from flask import Flask, request

@flask_app.route('/processPOSTJSON', methods = ['POST'])
def processPOSTJSON() :
    '''
    处理客户端上传的JSON数据
    :return:
    '''

    form_request = request.form

    json_of_metadatas = form_request.to_dict(flat = False)

    # type(metadata) --> string
    metadata = json_of_metadatas['json'][0]

    # convert string to dictionary
    metadata_dict = ast.literal_eval(str(metadata))

    name = metadata_dict['name']
    site = metadata_dict['website']

    print('\nMy name: {}, personal site: {}\n'.format(name, site))

Postman 上模拟,Value 的值设成 'Text', 然后写上整个 JSON 的值。

flask_json_file_03

flask同时处理json和上传的文件

代码部分就是上面两者的结合,没什么可说的,Postman 模拟分成两块, 如下

flask_json_file_04

参考资料


Comments

comments powered by Disqus