Flask-RESTful - 返回自定义响应格式

22

根据Flask-RESTful文档,我已经定义了一个自定义响应格式,如下所示。

app = Flask(__name__)
api = restful.Api(app)

@api.representation('application/octet-stream')
def binary(data, code, headers=None):
    resp = api.make_response(data, code)
    resp.headers.extend(headers or {})
    return resp

api.add_resource(Foo, '/foo')

我有以下的Resource类。

class Foo(restful.Resource):

    def get(self):
        return something

    def put(self, fname):
        return something

我希望get()函数返回application/octet-stream类型,put()函数返回默认的application/json

我该如何做到这一点?文档在这一点上并不是很清楚。

3个回答

26

使用什么表示法取决于请求Accept头部的媒体类型。

如果收到一个application/octet-stream类型的请求,将使用binary函数进行响应。

如果需要从API方法获得特定的响应类型,则必须使用flask.make_response()返回一个预先生成的响应对象:

def get(self):
    response = flask.make_response(something)
    response.headers['content-type'] = 'application/octet-stream'
    return response

4

1
这个在 Resource 类中怎么实现?提供一些代码片段会很有帮助。 - Ayrx
1
我正在查看 https://github.com/twilio/flask-restful/blob/master/flask_restful/__init__.py 的第475行,dispatch_request函数可以返回flask Response对象。 - Alex
我改正了。然而,这并没有解释如何使用自定义表示。 - Martijn Pieters

1
除了@Martijin Pieters的答案之外 - https://dev59.com/mWIj5IYBdhLWcg3weE0J#20246014。在您返回原始响应对象的情况下,Flask-Restful还允许您直接在返回值中设置状态代码和标头。
因此,在您的情况下,这也应该起作用。
class Foo(restful.Resource):

    def get(self):
        return something, 201, {'content-type': 'application/octet-stream'}

Flask-RESTful 的默认媒体类型是 'application/json',所以 put 方法应该可以直接使用。

2
我已经尝试使用它,但仍然出现“TypeError:类型为bytes的对象不可序列化为JSON”的错误。 - JackTheKnife

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