разбивка поиска по страницам в колбе не работает для следующей страницы

#python #sqlite #flask

#питон #sqlite #flask

Вопрос:

Описание проблемы: у меня есть список имен игроков, хранящихся в базе данных Sqlite в таблице игроков. Есть кнопка поиска PlayerHome. Теперь , когда я ищу конкретного игрока Nick , я получаю реальное количество игроков , присутствующих в базе данных в этом случае 971 . Мое отображение на странице 10 Результат NickShow. В этой разбивке на страницы номер 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 , а затем разбивка на страницы с этого момента идет гладко.
AlexSearchAPI
Но теперь поиск кнопок не работает… Есть ли какой-нибудь способ, которым я могу добавить как кнопку, так и вызов API вместе?

Ответ №1:

Проблема в том, что когда вы нажимаете «2» text , поле, которое использовалось для хранения ника в HTML, не имеет значения, поэтому args = request.form['text'] происходит сбой кода с KeyError.
Вам нужно заполнять текстовое поле ником каждый раз, когда страница отображается в серверной части. Это также удобно для пользователя, поскольку пользователь может видеть, какой текущий поисковый запрос

Комментарии:

1. спасибо, как вы и предлагали, я внес изменения, теперь он работает как вызов API, но не с кнопки. есть ли у вас какие-либо предложения о том, как объединить обе функции? Я обновил свой вопрос?