Не работает метод ООП с обработчиком Flask (думаю проблема в пагинации)
я делал сайт преимущественно в процедурном стиле. Сейчас я хотел бы переделать его с учетом парадигмы ООП. Я начал с обработчиков определённой страницы, так как у меня 8 одинаковых страниц(по структуре, но разных по тому, какие именно данные из БД на них отображаются), поэтому дабы сократить код, я решил сделать метод обработчика. Вот так выглядит один из обработчиков:
# Обработчик страницы с фейерверками
@app.route('/fireworks', methods=['GET', 'POST'])
@limiter.limit("100 per minute")
def fireworks():
app.logger.info('Входящий запрос: %s %s', request.method, request.path)
page = request.args.get('page', type=int, default=1)
products = Item.query.filter_by(category=8).paginate(
page=page,
per_page=9,
error_out=False)
pagination = Pagination(
page=page,
total=products.total,
per_page=9,
bs_version=4)
delete_form = DeleteItemsForm()
if request.method == 'POST':
if delete_form.validate_on_submit():
item_id = request.form.get('product_id')
item = Item.query.get(item_id)
if item:
try:
db.session.delete(item)
db.session.commit()
return redirect(url_for('fireworks'))
except Exception as ex:
print(ex)
else:
print('Ошибка при удалении товара', 'error')
return render_template('fireworks.html',
form=delete_form,
products=products.items,
pagination=pagination,
total_pages=products.pages,
check_total=Checking.check_admin())
Вот такой метод я из него сделал:
class BasePage:
def __init__(self):
pass
def render(self):
raise NotImplementedError
class PageHandler1(BasePage):
def __init__(self, num_cat, name_page, name_html):
self.num_cat = num_cat
self.name_page = name_page
self.name_html = name_html
def render(self, page=1):
app.logger.info('Входящий запрос: %s %s', request.method, request.path)
products = Item.query.filter_by(category=self.num_cat).paginate(
page=page,
per_page=9,
error_out=False)
pagination = Pagination(
page=page,
total=products.total,
per_page=9,
bs_version=4)
delete_form = DeleteItemsForm()
delete_form = DeleteItemsForm()
if request.method == 'POST':
if delete_form.validate_on_submit():
item_id = request.form.get('product_id')
item = Item.query.get(item_id)
if item:
try:
db.session.delete(item)
db.session.commit()
return redirect(url_for(self.name_page))
except Exception as ex:
print(ex)
else:
print('Ошибка при удалении товара', 'error')
return render_template(self.name_html,
form=delete_form,
products=products.items,
pagination=pagination,
total_pages=products.pages,
check_total=Checking.check_admin())
Вот так я вызываю этот метод:
@app.route("/<name_page>")
@limiter.limit("100 per minute")
def map_endpoint(name_page: str):
endpoints = {
"flowers": PageHandler1(1, 'flowers', 'flowers.html'),
"bouquets": PageHandler1(2, 'bouquets', 'bouquets.html'),
"baskets": PageHandler1(3, 'baskets', 'baskets.html'),
"indoor": PageHandler1(4, 'indoor', 'indoor.html'),
"artificial": PageHandler1(5, 'artificial', 'artificial.html'),
"wreaths": PageHandler1(6, 'wreaths', 'wreaths.html'),
"toys": PageHandler1(7, 'toys', 'toys.html'),
"fireworks": PageHandler1(8, 'fireworks', 'fireworks.html')}
if name_page not in endpoints:
print("Error 404")
page_handler = endpoints[name_page]
page = request.args.get('page', type=int, default=1)
return page_handler.render(page=page)
Проблема заключается вот в чём: когда я запускаю простой обработчик в виде функции, всё работает так, как и задумывалось, но когда я вызываю его как метод класса(описанного выше), то сама пустая страница(имеется в виду страница без карточек товара) отображается, но если добавить в базу данных айтемы(товары), то при появлении карточек товара на этой странице, сайт слетает и выдаёт следующую ошибку: werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'fireworks' with values ['page']. Did you mean 'flowers' instead?. Как я понимаю дело именно в пагинации, но никак не пойму что именно не так, пробовал передавать page прямо в методе, результат тот же, помогите пожалуйста))