web-dev-qa-db-ja.com

Flask-RESTful-カスタム応答形式を返します

次のように、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_を返します。

どうすればこれを行うことができますか?この点に関して、ドキュメントはあまり明確ではありません。

17
Ayrx

使用される表現は、requestAcceptヘッダーmimeタイプによって決定されます。

_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
_
19
Martijn Pieters

メソッドでFlask応答オブジェクトを返すだけです。

応答クラスを使用すると、カスタムヘッダー(コンテンツタイプを含む)を提供できます。 http://flask.pocoo.org/docs/api/#response-objects

3
Alex

@Martijin Pietersの回答に加えて-- https://stackoverflow.com/a/20246014/1869562 。生の応答オブジェクトを返す場合、Flask-Restfulを使用すると、戻り値にステータスコードとヘッダーを直接設定することもできます。

だからあなたの場合、これもうまくいくはずです

class Foo(restful.Resource):

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

Flask-REstfulのデフォルトのメディアタイプは「application/json」であるため、putはそのまま機能するはずです。