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

Dan*_*el 4 python multipart flask

您好,我正在尝试从获取请求的数据中返回多部分。但是我无法返回MultipartEncoder 对象作为响应。我已尝试解决方案 Can I service 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)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

Flask 没有针对多部分 mime 响应的具体规定;multipart/form 是一种 mimetype,通常仅在对服务器的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})
Run Code Online (Sandbox Code Playgroud)

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

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

并在流式传输响应数据时使用它来包装您的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})
Run Code Online (Sandbox Code Playgroud)

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