2012-10-13 69 views
14

我想在我的網站上使用一些搜索功能。在輸出頁面中,我獲得了單頁中的所有結果。但是,我想將其分發到多個頁面(即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)) 

在這裏,我想對URL輸出像「http://127.0.0.1:5000/my_search/assets?results1=0-100」 另外,如果我在瀏覽器中編輯URL地址就像我希望在未來100結果我能得到它on「http://127.0.0.1:5000/my_search/assets?results1=100-100

注意:這裏我使用sqlite作爲後端;所以我會在我的查詢中使用「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

回答

32

功能參數只映射到路由變量。這意味着在你的情況下,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') 
    ... 

順便說一句,你最好不要構造你的SQL你的方式,使用佔位符和變量。您的代碼容易受到SQL injection的影響。你不能相信來自用戶的任何輸入。

正確的方式做,這取決於實際的數據庫上,但例如,如果你使用MySQL,你可以這樣做(不,我不使用%運營商):

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

優秀.. 。其工作..。 是的,你是對的;我正在使它容易受到SQL注入的影響,我將替換所有這些;但截至目前,我正在使用正則表達式來過濾所有的用戶輸入! – namit