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 шт):
При обращении по адресу /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 категории