返回 JSON 和文件

Mic*_*ter 4 python flask

如何返回 JSON 响应和文件响应:

现在我这样做:

runNumber = "A0001"
response = None
try:
    response = make_response("Line One\r\nLine Two\r\n")
    response.headers["Content-Disposition"] = "attachment; filename=" + runNumber + ".txt"
except MyCustomException as e:
    response = jsonify(error=e.value, runnumber=runNumber)
except:
    raise
return(response)
Run Code Online (Sandbox Code Playgroud)

但这仅允许我返回 JSON 或文件。在某些情况下,我想同时返回两者。

[编辑:] 我想返回 JSON 和文件的情况是当有关于用户在使用文件之前应该检查的文件内容的警告时。

如果这是不可能的,我会将警告添加到文件的内容中。

Mar*_*ers 6

您不能只返回两个响应。你只能返回一个。

这意味着如果你真的需要同时返回 JSON 和一个文件,你需要想出一个方案,让你在一个响应中返回这两个,让客户端再次分离文件和 JSON 部分。

这没有标准。无论您想出什么,都需要仔细记录下来,以便您的客户明确处理。

您可以使用自定义标头来存储 JSON 数据,例如:

response = make_response("Line One\r\nLine Two\r\n")
response.headers["Content-Disposition"] = "attachment; filename=" + runNumber + ".txt"
response.headers['X-Extra-Info-JSON'] = json.dumps(some_object)
Run Code Online (Sandbox Code Playgroud)

或者您可以将文件内容放在 JSON 数据中。JSON 不是二进制数据的最佳格式,您可能希望首先将二进制数据编码为 Base64:

filedata = "Line One\r\nLine Two\r\n".encode('base64')
return jsonify(name=runNumber + '.txt', data=filedata)
Run Code Online (Sandbox Code Playgroud)

或者您可以创建一个多部分 MIME 文档,与 POSTmultipart/form-data正文的工作方式相同。

你选择什么取决于你的用例(什么样的客户端使用你的 API)和数据的大小(JSON 响应中的兆字节文件数据不太可行)。