2012-10-13 11 views
14

के पैरामीटर प्रबंधित करना मुझे अपनी वेबसाइट में कुछ खोज सुविधा चाहिए। आउटपुट पेज में, मुझे एक ही पृष्ठ में सभी परिणाम मिल रहे हैं। हालांकि, मैं इसे कई पृष्ठों (जैसे 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)) 

यहाँ मैं की तरह यूआरएल पर उत्पादन चाहते हैं "http://127.0.0.1:5000/my_search/assets?results1=0-100" इसके अलावा, अगर मैं ब्राउज़र में यूआरएल पता संपादित मैं अगले 100 परिणाम मैं इसे प्राप्त कर सकते हैं चाहता हूँ की तरह:

यहाँ नीचे मेरी कोड है "http://127.0.0.1:5000/my_search/assets?results1=100-100"

नोट: यहां मैं एसक्लाइट का बैकएंड के रूप में उपयोग कर रहा हूं; तो मैं अपने परिणामों को सीमित करने के लिए अपने प्रश्नों में "limit_factor" का उपयोग करूंगा। और "query_builder" और "query_builder_count" केवल जटिल कार्य हैं जो जटिल एसक्यूएल प्रश्न उत्पन्न कर रहे हैं।

लेकिन मुझे जो त्रुटि मिल रही है वह है "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') 
    ... 

Btw, तो आप बेहतर अपने एसक्यूएल जिस तरह से आप करते हैं, उपयोग प्लेसहोल्डर और चर का निर्माण नहीं। आपका कोड SQL injection पर कमजोर है। आप उपयोगकर्ता से आने वाले किसी भी इनपुट पर भरोसा नहीं कर सकते हैं।

यह करने के लिए सही तरीका वास्तविक डेटाबेस पर निर्भर करता है, लेकिन उदाहरण के लिए यदि आप MySQL का उपयोग करें, यदि आप ऐसा करते हैं (नहीं है कि मैं % ऑपरेटर का उपयोग नहीं कर रहा हूँ):

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

बहुत बढ़िया .. । यह काम कर रहा है.. । और हाँ आप सही हैं; मैं इसे एसक्यूएल इंजेक्शन के लिए कमजोर बना रहा हूं, मैं उन सभी को बदल दूंगा; लेकिन अभी तक, मैं सभी उपयोगकर्ता-इनपुट फ़िल्टर करने के लिए regex का उपयोग कर रहा हूँ !!! – namit