Flask необязательный аргумент для url

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

Сейчас реализовано так

class Books(flask_restful.Resource):

    def __init__(self):
        self.reqparse = reqparse.RequestParser()
        self.reqparse.add_argument('categoty_id', type=int, location='json')
        super(Books, self).__init__()

    def get(self, categoty_id):
        # some logic
        return None


app = Flask('test')
app.config["DEBUG"] = True
api = flask_restful.Api(app)
api.add_resource(Books, '/api/v1/books', '/api/v1/books/<categoty_id>')
app.run()

Получаю конкретную категорию книг (допустим categoty_id=123 , научная литература)

http://localhost/api/v1/books/123

И хочу что бы было доступно вернуть все книги по url

http://localhost/api/v1/books

Пытался добавить required=False при добавлении аргумента. Однако это не решило проблему.

self.reqparse.add_argument('category_id', type=int, location='json', required=False)

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


Ответы (1 шт):

Автор решения: insolor

При обращении по адресу /api/v1/books показывает ошибку: TypeError: get() missing 1 required positional argument: 'category_id'. Это означает что метод вызывается без параметра, хотя он требуется.

Просто добавьте параметру id значение по-умолчанию:

class Books(flask_restful.Resource):

    def __init__(self):
        self.reqparse = reqparse.RequestParser()
        self.reqparse.add_argument('category_id', type=int, location='json')
        super(Books, self).__init__()

    def get(self, category_id='default'):
        return category_id

При запросе на /api/v1/books будет возвращать "default", при запросе на /api/v1/books/123 - "123".

Именно строку "default" указал для примера, можно использовать просто None:

def get(self, category_id=None):
    if category_id is None:
        ...  # Вернуть список всех книг
    else:
        ...  # Вернуть книгу с указанным id категории
→ Ссылка