Управление параметрами URL (Python Flask) - программирование
Подтвердить что ты не робот

Управление параметрами URL (Python Flask)

Я хочу, чтобы на моем сайте была функция поиска. На выходной странице я получаю все результаты на одной странице. Однако я хочу распространять его на многие страницы (т.е. 100 поисков/страниц). Для этого я передаю несколько запросов по умолчанию в "urlfor", но он не работает. Я знаю, что делаю небольшую ошибку, но я ее не поймаю.

Вот мой код ниже:

@app.route('/', methods=['GET', 'POST'])
def doSearch():
    entries=None
    error=None
    if request.method=='POST':
        if request.form['labelname']:
            return redirect(url_for('show_results',results1='0-100', labelname=request.form['labelname'] ))
        else:
            error='Please enter any label to do search'
    return render_template('index.html',entries=entries, error=error)




@app.route('/my_search/<labelname>')
def show_results(labelname=None, resultcount=None, results1=None):
    if not session.get('user_id'):
        flash('You need to log-in to do any search!')
        return redirect(url_for('login'))

    else:
        time1=time()
        if resultcount is None:
            total_count=g.db.execute(query_builder_count(tablename='my_data',nametomatch=labelname, isextension=True)).fetchall()[0][0]

        limit_factor=" limit %s ,%s"%(results1.split('-')[0],results1.split('-')[1])

        nk1=g.db.execute(query_builder(tablename='my_data',nametomatch=labelname, isextension=True) + limit_factor)
        time2=time()
        entries=[]
        maxx_count=None
        for rows in nk1:
            if maxx_count is None:
                maxx_count=int(rows[0])
            entries.append({"xmlname":rows[1],'xmlid':rows[2],"labeltext":rows[12]})
        return render_template('output.html', labelname=labelname,entries=entries, resultcount=total_count, time1=time2-time1, current_output=len(entries))

Здесь я хочу выводить на URL-адрес типа "http://127.0.0.1:5000/my_search/assets?results1=0-100" Кроме того, если я отредактирую адрес URL-адреса в браузере, как будто я хочу получить следующий 100 результат, я могу получить его на "http://127.0.0.1:5000/my_search/assets?results1=100-100"

Примечание: здесь я использую sqlite как backend; поэтому я буду использовать "limit_factor" в моих запросах, чтобы ограничить мои результаты. И "query_builder" и "query_builder_count" - это просто простые функции, которые генерируют сложные sql-запросы.

но ошибка, которую я получаю, - "NoneType", не может быть разделена. Он остановился на "limit_factor".

Здесь предельный коэффициент - это только один фильтр, который я применил; но я хочу применить больше фильтров, например, я хочу найти по его местоположению "http://127.0.0.1:5000/my_search/assets?results1=0-100&location=asia"

4b9b3361

Ответ 1

Параметры функции отображаются только для переменных маршрута. Это означает, что в вашем случае функция show_results должна иметь только один параметр и labelname. Вам даже не нужно устанавливать его на None, потому что он всегда должен быть установлен (иначе маршрут не будет соответствовать).

Чтобы получить параметры запроса, используйте flask.request.args:

from flask import request

@app.route('/my_search/<labelname>')
def show_results(labelname=None):
    results1 = request.args.get('results1', '0-100')
    ...

Btw, лучше не строить свой SQL так, как вы, использовать заполнители и переменные. Ваш код уязвим для SQL-инъекции. Вы не можете доверять любым данным, поступающим от пользователя.

Правильный способ сделать это зависит от фактической базы данных, но, например, если вы используете MySQL, вы сделали бы это (не то, что я не использую оператор %):

sql = ".... LIMIT %s, %s"
g.db.execute(sql, (limit_offset, limit_count))