2012-10-13 18 views
14

私のウェブサイトにいくつかの検索機能が必要です。出力ページでは、すべての結果を1ページで取得しています。しかし、私はそれを多数のページ(つまり、100検索/ページ)に配布したいと思います。そのために、私は "urlfor"でいくつかのデフォルト検索を渡していますが、うまくいきません。私は小さな誤りをしていることを知っているが、私はそれをキャッチしていない。ここでURLのパラメータを管理する(Python Flask)

は、以下の私のコードです:ここでは

@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)) 

私は次の100の結果をしたいように、私は、ブラウザでURLアドレスを編集した場合、私はそれを得ることができ、また、「http://127.0.0.1:5000/my_search/assets?results1=0-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"

答えて

32

のような、より多くのフィルタを適用したい。機能パラメータは経路変数にのみマップされる。つまり、あなたの場合、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 injectionに脆弱です。ユーザーからの入力を信頼することはできません。

これを行うための正しい方法は、実際のデータベースに依存しますが、MySQLを使用している場合たとえば、あなたは(私は%演算子を使用していないではないこと)、これを行うだろう:

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

優れました.. 。その働く.. はい、あなたは正しいです。私はSQLインジェクションに脆弱にしています。私はそれらをすべて置き換えます。しかし今のところ、私は正規表現を使ってすべてのユーザー入力をフィルタリングしています! – namit

関連する問題