【问题标题】:How to customize response content type in flask-restful?如何在 flask-restful 中自定义响应内容类型?
【发布时间】:2014-11-19 08:19:10
【问题描述】:

我希望能够返回 application/json 以外的其他内容,即 kml。

我有以下几点:

@api.representation('application/vnd.google-earth.kml+xml')
def kml(data):
    return Response(data, mimetype='application/vnd.google-earth.kml+xml')

class mykml(restful.Resource):

    def get(self):
        r = requests.get("http://myurl/kml") # This retrieves a .kml file   
        response = make_response(r.content)
        response.headers['Content-Type'] = "application/vnd.google-earth.kml+xml"

        return response

为什么这仍然返回应用程序/json?另外,如果我有不同的格式,我可以在没有装饰器的情况下动态更改 mykml 类中响应的 Content-Type 吗?

进口:from flask import Flask, request, Response, session,make_response

【问题讨论】:

  • 响应内容类型取决于请求标头
  • @api.representation() 仅用于注册一个表示转换函数。 如果请求中的Accept标头已设置为application/vnd.google-earth.kml+xml,则将使用kml()函数。
  • 如何在 mykml 资源上设置 Accept 标头?
  • 你没有。您在 request 上设置它。请参阅重复的答案,您可以返回一个 Response 对象(使用 flask.make_response() 创建一个)。

标签: python flask flask-restful


【解决方案1】:

如果您需要 API 方法的特定响应类型,则必须使用 flask.make_response() 来返回“预烘焙”响应对象:

def get(self):
    response = flask.make_response(something)
    response.headers['content-type'] = 'application/vnd.google-earth.kml'
    return response

【讨论】:

  • post 方法怎么样?如果发出 POST 请求并期望输出应使用预定义的响应主体模式进行自定义,您将如何处理?
  • @beyond_inifinity Flask-RESTPlus 响应编组提供了一种简单的方法来控制您在响应中实际呈现的数据或期望在输入负载中的数据。使用 fields 模块,您可以在资源中使用您想要的任何对象(ORM 模型/自定义类/等)。字段还允许您格式化和过滤响应,因此您不必担心暴露内部数据结构。
猜你喜欢
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 2015-12-11
  • 1970-01-01
  • 2014-12-15
相关资源
最近更新 更多