如何在 Flask-RESTful 中自定义响应内容类型?

12

我希望能够返回除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
为什么它仍然返回application/json?此外,如果我有不同的格式,我能否在class mykml中动态更改响应的Content-Type而不使用装饰器?Imports: from flask import Flask, request, Response, session, make_response

响应内容类型取决于请求头 - Martijn Pieters
2
可能是Flask-RESTful - 返回自定义响应格式的重复问题。 - Martijn Pieters
2
你不需要这么做。你可以在请求上设置它。看到重复的答案,你可以返回一个Response对象(使用flask.make_response()创建一个)。 - Martijn Pieters
你能提供一个示例,说明你所指的是什么吗?我可能误解了,但我刚刚更新了我的处理程序,在请求之前包含了Accept头,但它仍然不起作用。上面接受的答案对于我如何使用flask.make_response似乎没有意义。这是否发生在mykml资源中? - Rolando
我已经更新了答案,使其更加明确。 - Martijn Pieters
显示剩余6条评论
1个回答

2
如果你需要从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模型/自定义类等)。Fields还允许您格式化和过滤响应,因此您不必担心暴露内部数据结构。 - Subir Verma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接