返回包含png文件和markdown的multipart / formdata作为Flask响应

时间:2018-07-17 11:37:08

标签: python flask multipart

嗨,我正在尝试从get请求中返回数据的整数部分。但是,我无法返回MultiPartEncoder对象作为响应。我尝试了解决方案 Can I serve a multipart http response in Flask?

以下代码仅返回“ toPersonEmail”字段。如何在Flask中返回m作为响应?

@app.route("/multipart", methods=['GET'])
def send_multipart():
     m = MultipartEncoder(fields={ 'markdown': "> Block quotes are written like so in markdown.",
                                   'toPersonEmail':'d@d.com',
                                   'files': ("pnggrad16rgb.png", open("pnggrad16rgb.png", 'rb'),
                                   'image.png')})


     return Response(m.fields, mimetype=m.content_type)

1 个答案:

答案 0 :(得分:2)

烧瓶没有针对多部分mime回应的具体规定; multipart / form是一种模仿类型,通常仅用于对服务器的POST请求 中,而不用于HTTP服务器的响应中。

如果必须返回有效的多部分mime数据,则将主体呈现为字节并在响应对象上设置正确的标头; `(

m = MultipartEncoder(fields={ 'markdown': "> Block quotes are written like so in markdown.",
                               'toPersonEmail':'d@d.com',
                               'files': ("pnggrad16rgb.png", open("pnggrad16rgb.png", 'rb'),
                               'image.png')})

return (m.to_string(), {'Content-Type': m.content_type})

如果要响应,则必须提供自己的生成器函数,该函数从块的多部分编码器中读取:

def chunked_reader(f, chunksize=2 ** 20):  # 1Mb chunks
    while True:
        chunk = f.read(chunksize)
        if not chunk:
            return
        yield chunk

并使用它来包装streaming response data时的MultipartEncoder()实例:

# include the Content-Length header, even though we are streaming
return Response(
    chunked_reader(m), content_type=m.content_type,
    headers={'Content-Length': m.len})

MultipartEncoder()对象支持.read()方法,就像文件一样。