#python #sqlite #flask
#питон #sqlite #flask
Вопрос:
Описание проблемы: у меня есть список имен игроков, хранящихся в базе данных Sqlite в таблице игроков. Есть кнопка поиска . Теперь , когда я ищу конкретного игрока
Nick
, я получаю реальное количество игроков , присутствующих в базе данных в этом случае 971
. Мое отображение на странице 10
. В этой разбивке на страницы номер
1
страницы в порядке, но как только я нажимаю на страницу 2
, она показывает мне следующую ошибку
Как я могу это решить?
werkzeug.exceptions.BadRequestKeyError
werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
KeyError: 'text'
Это мое base.html
для search
<form class="form-inline my-2 my-lg-0" action="/search" method="POST">
<input class="form-control mr-sm-2" placeholder="Search" aria-label="Search" type="text" name="text">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
Это app.py
для search
конечной точки
@app.before_request
def before_request():
g.conn = sqlite3.connect(database)
g.conn.row_factory = sqlite3.Row
g.cur = g.conn.cursor()
@app.teardown_request
def teardown(error):
if hasattr(g, "conn"):
g.conn.close()
@app.route("/search", methods=['GET', 'POST'])
@print_exceptions
def search():
"""The function is used to test multi values url."""
sql = "select count(*) from player_details where player like (?);"
# this is where giving me the problem
args = request.form['text']
# each page is moving as if it's end point for search
g.cur.execute(sql, [args])
total = g.cur.fetchone()[0]
print(total)
page, per_page, offset = get_page_args()
sql = "select id, player, floor from player_details where player like (?) limit {}, {}"
print(sql.format(offset, per_page))
g.cur.execute(sql.format(offset, per_page), [args])
users = g.cur.fetchall()
pagination = get_pagination(
page=page,
per_page=per_page,
total=total,
record_name="users",
)
return render_template(
"index.html",
users=users,
page=page,
per_page=per_page,
pagination=pagination,
)
def get_css_framework():
return current_app.config.get("CSS_FRAMEWORK", "bootstrap4")
def get_link_size():
return current_app.config.get("LINK_SIZE", "sm")
def get_alignment():
return current_app.config.get("LINK_ALIGNMENT", "")
def show_single_page_or_not():
return current_app.config.get("SHOW_SINGLE_PAGE", False)
def get_pagination(**kwargs):
kwargs.setdefault("record_name", "records")
return Pagination(
css_framework=get_css_framework(),
link_size=get_link_size(),
alignment=get_alignment(),
show_single_page=show_single_page_or_not(),
**kwargs
)
Обновить
Я внес изменения в search
функциональность, как показано ниже:
@app.route("/search/<name>/")
@app.route("/search/<name>")
@print_exceptions
def search(name):
"""The function is used to test multi values url."""
sql = "select count(*) from player_details where player like (?);"
args = ("%{}%".format(name),)
print(args)
# args = request.form.get("name")
# if not args:
# args = request.form['text']
# else:
# args = args
g.cur.execute(sql, args)
.....
....
Теперь он работает как вызов API в графическом интерфейсе.. вот так http://localhost:5050/search/Alex
, а затем разбивка на страницы с этого момента идет гладко.
Но теперь поиск кнопок не работает… Есть ли какой-нибудь способ, которым я могу добавить как кнопку, так и вызов API вместе?
Ответ №1:
Проблема в том, что когда вы нажимаете «2» text
, поле, которое использовалось для хранения ника в HTML, не имеет значения, поэтому args = request.form['text']
происходит сбой кода с KeyError.
Вам нужно заполнять текстовое поле ником каждый раз, когда страница отображается в серверной части. Это также удобно для пользователя, поскольку пользователь может видеть, какой текущий поисковый запрос
Комментарии:
1. спасибо, как вы и предлагали, я внес изменения, теперь он работает как вызов API, но не с кнопки. есть ли у вас какие-либо предложения о том, как объединить обе функции? Я обновил свой вопрос?