GET с параметром и без него в flask-restful

Следующее кажется мне неэлегантным, но оно работает. Есть ли способ заставить flask-restful обрабатывать две стандартные разновидности get (т. е. получить все и получить один элемент), используя один и тот же класс ресурсов?

Спасибо.

from flask_restful import Resource
# ...

class People(Resource):
    def get(self):
        return [{'name': 'John Doe'}, {'name': 'Mary Canary'}]

class Person(Resource):
    def get(self, id):
        return {'name': 'John Doe'}
# ...

api.add_resource(People, '/api/people')
api.add_resource(Person,  '/api/people/<string:id>')

person John Lockwood    schedule 06.09.2015    source источник
comment
Извините, но я так не думаю. Всякий раз, когда я пытался, я получал ошибку TypeError: get() отсутствует 1 требуемый позиционный аргумент. Было бы неплохо, если бы позиционный аргумент мог быть необязательным и устанавливаться в None, когда он не передается, но, возможно, есть причина, по которой он не работает таким образом.   -  person Kelly Keller-Heikkila    schedule 06.09.2015
comment
В конце концов я настолько разочаровался, что протестировал Proof of Concept для альтернативной реализации — GIST находится здесь bit.ly/1RVzWm9 . Я верю и сказал об этом здесь: github.com/flask-restful/flask -restful/issues/114 причина этого в том, что Flask-Restful следовал по пути наименьшего сопротивления, учитывая реализацию Flask add_url_rule.   -  person John Lockwood    schedule 02.01.2016


Ответы (2)


Я думаю, это то, что вы ищете:

from flask_restful import Resource
# ...


class People(Resource):

    def get(self, id=None):
        if not id:
            return {'name': 'John Doe'}
        return [{'name': 'John Doe'}, {'name': 'Mary Canary'}]


api.add_resource(People, '/api/people', '/api/people/<id>')

Вы можете наложить ограничения на покупку id, добавив ее в качестве аргумента парсеру запросов:

parser.add_argument('id', location='view_args', type=..)
person kardaj    schedule 15.06.2016

Да, ознакомьтесь с документацией по разбору аргументов. При необходимости это даст вам возможность создать некоторую логику вокруг аргументов, полученных с запросом.

from flask_restful import Api, Resource, reqparse
# ...

api = Api(app)
parser = reqparse.RequestParser()
parser.add_argument('id')

class People(Resource):
def get(self):
    data = parser.parse_args()
    if not data['id']:
        return [{'name': 'John Doe'}, {'name': 'Mary Canary'}]
    else:
        # data lookup using id
        # for example using SQLAlchemy...
        # person = Person.query.filter_by(id = data['id']).first_or_404()
        return {'id': data['id'], 'name': 'John Doe'}

api.add_resource(People, '/api/people')

Затем попробуйте с:

  • локальный хост:/api/люди
  • локальный хост:/API/люди?id=1
person siegerts    schedule 21.09.2015
comment
я думаю, что это не так, как реализован Restful .. imo - person rrw; 26.03.2016
comment
Может не соответствовать спецификации REST, но это все же возможно с flask-restful - person siegerts; 26.03.2016
comment
да, я не говорил, что это невозможно, я вижу это нормально, но я просто говорю, что это не так, как это должно быть реализовано, если это REST, потому что некоторые новички, ищущие и наткнувшиеся на это, могут подумать, что это так, как это должно быть реализовано :) - person rrw; 26.03.2016