Python Chalice Framework:请求未指定带有图像/jpeg的接受标头

Python Chalice Framework:请求未指定带有图像/jpeg的接受标头,python,amazon-web-services,chalice,Python,Amazon Web Services,Chalice,我想从Chalice/python应用程序返回一个图像。我的整个应用程序代码粘贴在下面: from chalice import Chalice, Response import base64 app = Chalice(app_name='hello') @app.route('/makeImage', methods=['GET']) def makeImage(): return Response( base64.b64decode( "

我想从Chalice/python应用程序返回一个图像。我的整个应用程序代码粘贴在下面:

from chalice import Chalice, Response
import base64

app = Chalice(app_name='hello')

@app.route('/makeImage', methods=['GET'])
def makeImage():
    return Response(
        base64.b64decode(
            "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="
        ),
        headers={
            'Content-Type': 'image/jpeg'
        },
        status_code=200)
结果

{“代码”:“BADDREQUEST”,“消息”:“请求未指定接受” 带有image/jpeg的标头,响应的内容类型为image/jpeg。 如果响应具有二进制内容类型,则请求必须指定 匹配的接受标头。“}

为什么会发生这种情况

我已经浏览了大量文档,其中大部分已经过时,因为Chalice最近添加了二进制支持:

  • (警告:这个问题的唯一答案是完全错误的)
  • (2017年未经决议错误关闭的发行)
  • 是上面391的重新开放
出于故障排除的目的,我可以通过使用
curl-H“accept:image/jpeg”
获得响应,但这是无用的,因为浏览器不能以这种方式工作,我需要在浏览器中使用响应(HTML IMG标记)

更新

我还尝试了
@app.route('/makeImage',methods=['GET'],content_types=['image/jpeg'])


结果变成了
{“code”:“UnsupportedMediaType”,“Message”:“Unsupported media type:application/json”}

Chalice中有一个bug,于2019年5月14日修复,并记录在此处:

除了直接从GitHub安装最新的Chalice外,我还必须添加:

app.api.binary_types =['*/*']
app.py

最终的工作代码如下所示:

from chalice import Chalice, Response
import base64

app = Chalice(app_name='hello')
app.api.binary_types =['*/*']

@app.route('/makeImage', methods=['GET'])
def makeImage():
    return Response(
        base64.b64decode(
            "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="
        ),
        headers={
            'Content-Type': 'image/jpeg'
        },
        status_code=200)

在2019年5月14日修复的Chalice中有一个bug,记录如下:

除了直接从GitHub安装最新的Chalice外,我还必须添加:

app.api.binary_types =['*/*']
app.py

最终的工作代码如下所示:

from chalice import Chalice, Response
import base64

app = Chalice(app_name='hello')
app.api.binary_types =['*/*']

@app.route('/makeImage', methods=['GET'])
def makeImage():
    return Response(
        base64.b64decode(
            "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="
        ),
        headers={
            'Content-Type': 'image/jpeg'
        },
        status_code=200)
我也有同样的问题

如果不存在头accept,AWS将其设置为默认应用程序/json,我将收到base64响应。如果我将accept设置为images/jpeg或header中的任何二进制内容类型,那么我就得到了图像。很好,但web浏览器无法设置accept标头

但如果我加上

app.api.binary_types =['*/*']
那么ok我的图像API现在可以工作了很好,但是现在json的失败了。

目前我没有看到任何解决方案,只有两个API网关:一个用于json,一个用于图像。如果您真的只需要一个API网关,我认为您必须在所有json响应上使用gzip压缩来将它们转换为二进制文件

AWS API网关如何与lambda代理一起工作,而不是Chalice问题。但我同意,这是一个很大的限制

我也有同样的问题

如果不存在头accept,AWS将其设置为默认应用程序/json,我将收到base64响应。如果我将accept设置为images/jpeg或header中的任何二进制内容类型,那么我就得到了图像。很好,但web浏览器无法设置accept标头

但如果我加上

app.api.binary_types =['*/*']
那么ok我的图像API现在可以工作了很好,但是现在json的失败了。

目前我没有看到任何解决方案,只有两个API网关:一个用于json,一个用于图像。如果您真的只需要一个API网关,我认为您必须在所有json响应上使用gzip压缩来将它们转换为二进制文件


AWS API网关如何与lambda代理一起工作,而不是Chalice问题。但我同意,这是一个很大的限制

这个问题也涉及到了破坏json的问题:这个问题也涉及到破坏json的问题: