2012-10-13 17 views
14

Web sitemde bazı arama özellikleri istiyorum. Çıktı sayfasında, tüm sonuçları tek sayfada alıyorum. Ancak, bunu birçok sayfaya dağıtmak istiyorum (yani 100 arama/sayfa). Bunun için "urlfor" da bir dizi varsayılan aramadan geçiyorum ama çalışmıyor. Biliyorum küçük bir hata yapıyorum ama onu yakalamıyorum. Ben tarayıcıda url adresini düzenlemek eğer "http://127.0.0.1:5000/my_search/assets?results1=0-100" Ayrıca, ben bunu geçiren ilk 100 sonuç istediğim gibi İşteURL parametrelerini yönetme (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)) 

ben gibi URL'yi çıkışı istiyorum: Burada

aşağıda benim kodudur " http://127.0.0.1:5000/my_search/assets?results1=100-100"

Not: Burada arka uç olarak sqlite kullanıyorum; Bu yüzden sonuçlarımı sınırlamak için "limit_factor" seçeneğini kullanıyorum. Ve "query_builder" ve "query_builder_count", karmaşık sql sorguları üreten basit işlevlerdir.

Ancak aldığım hatanın "NoneType" bölümü bölünemez. "limit_factor"'da durdu.

Burada, limit faktörü uyguladığım tek bir filtredir; ama daha fazla filtre uygulamak istiyorum, örneğin, "http://127.0.0.1:5000/my_search/assets?results1=0-100&location=asia"

cevap

32

Fonksiyon parametreleri sadece rota değişkenleriyle eşleştirilir. Bu durumda, show_results işlevinin yalnızca bir parametresi olması ve labelname olmasıdır. Varsayılan olarak None olarak ayarlamanız gerekmez, çünkü her zaman ayarlanmalıdır (aksi halde rota eşleşmez).

sorgu parametrelerini almak için, flask.request.args kullanın:

from flask import request 

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

Btw, daha iyi bir SQL yapmanız şekilde, kullanım tutucuları ve değişkenleri oluşturmak değil. Kodunuz SQL injection'a karşı savunmasızdır. Kullanıcıdan gelen herhangi bir girdiye güvenemezsiniz.

Bunu yapmanın doğru yolu gerçek veritabanına bağlıdır, ancak MySQL kullanmak durumunda örneğin, (I % operatörünü kullanarak değilim değil) bu yapardı:

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

Mükemmel .. . işe yarıyor.. . ve evet haklısınız; SQL enjeksiyonuna karşı savunmasız yapıyorum, hepsini değiştireceğim; ancak şu an itibariyle, tüm kullanıcı girişlerini filtrelemek için regex kullanıyorum !!! – namit

İlgili konular