У меня есть функция, определенная следующим образом:
@app.route('/products', methods=['GET'])
@app.route('/products/<id>', methods=['GET', 'PUT'])
def foo():
id = request.args.get('id', type=int)
if id != None and request.method in ['GET', 'PUT']:
# route to editing product template
else:
# display products as table
Я определил таблицу Flask следующим образом:
class ProductsTable(Table):
id=Col('ID', show=False)
price=Col('Price')
available_online=Col('Available online?')
available_num=Col('In stock')
edit=ButtonCol('Edit', url_kwargs=dict(id='id'), endpoint='/products')
Я запрашиваю базу данных SQLite и заполняю таблицу. Отображение работает нормально, но я борюсь с функциональностью редактирования.
Сейчас, как это работает, когда пользователь нажимает кнопку «Изменить», URL-адрес меняется на http://localhost:5000/products/1
, http://localhost:5000/products/2
и c. в зависимости от идентификатора элемента в БД и соответственно в таблице (поскольку он просто отображает данные БД).
Однако я хотел бы выяснить, можно ли передать идентификатор в качестве параметра URL, чтобы что URL для редактирования определенного продукта c нажатием кнопки Изменить становится http://localhost:5000/products?id=1
http://localhost:5000/products?id=2
et c.
Я попытался передать '/products/<id>'
аргументу endpoint
, но я получил следующая ошибка
werkzeug.routing.BuildError: Не удалось создать URL для конечной точки '/products/<id>'
со значениями ['id']
. Вы имели в виду 'products'
вместо этого?
Я также пробовал '/products?<id>'
, '/products?id=<id>'
, а также без /
перед products
, но результат был таким же. Единственная действительная конечная точка здесь - это просто products
.
Возможно ли это, и если да, как я могу добиться такого поведения?