16

Web サイトに検索機能が必要です。出力ページでは、すべての結果を 1 ページで取得しています。ただし、それを多くのページに分散させたい (つまり、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。また、次の 100 件の結果が必要なようにブラウザで URL アドレスを編集すると、" http://127.0.0.1:5000/my_search/assets?results1=100-100"で取得できます。

注: ここではバックエンドとして sqlite を使用しています。limit_factorそのため、クエリで" " を使用して結果を制限します。" query_builder" と " query_builder_count" は、複雑な SQL クエリを生成する単純な関数です。

しかし、私が得ているエラーは、「NoneType」は分割できないということです。で止まりました"limit_factor"

ここで、制限係数は、私が適用したフィルターの 1 つに過ぎません。しかし、より多くのフィルタを適用したいです。たとえば、その場所で検索したい " http://127.0.0.1:5000/my_search/assets?results1=0-100&location=asia"

4

1 に答える 1

36

関数パラメーターは、ルート変数にのみマップされます。つまり、あなたの場合、show_results関数にはパラメーターが 1 つしかなく、それが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')
    ...

ところで、SQL を自分のやり方で構築するのではなく、プレースホルダーと変数を使用することをお勧めします。あなたのコードはSQL インジェクションに対して脆弱です。ユーザーからの入力を信頼することはできません。

これを行う正しい方法は実際のデータベースによって異なりますが、たとえば MySQL を使用している場合は、次のようにします (%演算子を使用していないわけではありません)。

sql = ".... LIMIT %s, %s"
g.db.execute(sql, (limit_offset, limit_count))
于 2012-10-13T08:08:50.773 に答える