【问题标题】:Chalice Framework: Request did not specify an Accept header with image/jpeg圣杯框架:请求未指定带有图像/jpeg 的 Accept 标头
【发布时间】:2019-10-18 00:50:32
【问题描述】:

我想从 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)

结果...

{"Code":"BadRequest","Message":"请求没有指定接受 带有 image/jpeg 的标头,响应的 Content-Type 为 image/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"}

【问题讨论】:

    标签: python amazon-web-services chalice


    【解决方案1】:

    我有同样的问题。

    如果不存在标头接受,AWS 将其设置为默认应用程序/json,我会收到一个 base64 响应。如果我在标头中将接受设置为 images/jpeg 或任何二进制内容类型,那么我得到了图像。很好,但网络浏览器不设置接受标头。

    但是如果我添加

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

    那么好吧,我的图像 API 现在可以工作了。 很好,但现在 json 失败了。

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

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

    【讨论】:

    【解决方案2】:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 2011-11-03
      • 2016-12-02
      • 2012-03-05
      • 2011-02-27
      相关资源
      最近更新 更多