Chalice Framework:请求未指定带有image / jpeg

时间:2019-05-16 01:00:44

标签: 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(
            "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="
        ),
        headers={
            'Content-Type': 'image/jpeg'
        },
        status_code=200)

结果...

  

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

为什么会这样?

我已经阅读了大量文档,并且由于最近对Chalice添加了二进制支持,大部分文档已经过时了:

仅出于故障排除的目的,我可以使用curl -H "accept: image/jpeg"来获得响应,但这是没有用的,因为浏览器无法以这种方式工作,并且我需要在浏览器中使用响应(HTML IMG TAG)

更新

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

结果变为{"Code":"UnsupportedMediaType","Message":"Unsupported media type: application/json"}

2 个答案:

答案 0 :(得分:3)

我有同样的问题。

如果不存在标头接受,AWS将其设置为默认application / json,我将收到base64响应。如果将header设置为images / jpeg或任何二进制内容类型,那么我得到了图像。很棒,但是网络浏览器没有设置accept标头。

但是,如果我添加

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

然后确定,我的图像API现在可以使用了。 太好了,但是现在json失败了。

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

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

答案 1 :(得分:1)

Chalice中的一个错误已于2019年5月14日修复,并在此处记录:

  

https://github.com/aws/chalice/issues/1095

除了直接从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)