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')

У меня есть следующий класс ресурсов.

class Foo(restful.Resource):

    def get(self):
        return something

    def put(self, fname):
        return something

Я хочу, чтобы функция get() возвращала тип application/octet-stream, а функция put() возвращала значение по умолчанию application/json.

Как мне это сделать? Документация по этому поводу не очень ясна.


person Ayrx    schedule 27.11.2013    source источник


Ответы (3)


Используемое представление определяется запросом, типом mime заголовка 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
person Martijn Pieters    schedule 27.11.2013

Просто верните объекты ответа Flask в свои методы.

Класс ответа позволяет вам предоставлять настраиваемые заголовки (включая тип содержимого): http://flask.pocoo.org/docs/api/#response-objects

person Alex    schedule 27.11.2013
comment
Как это будет работать в классе ресурсов? Некоторые фрагменты кода будут полезны. - person Ayrx; 27.11.2013
comment
Я смотрю github.com/twilio/flask-restful / blob / master / flask_restful /, строка 475 dispatch_request, и можно вернуть объект ответа flask - person Alex; 27.11.2013
comment
Я исправился. Однако это не объясняет, как использовать пользовательские представления. - person Martijn Pieters; 27.11.2013

В дополнение к ответу @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 должен работать как есть.

person Kudehinbu Oluwaponle    schedule 24.12.2019
comment
Я пытался использовать его, но все равно получаю TypeError: Object of type bytes is not JSON serializable - person JackTheKnife; 23.06.2020