2012-10-13 12 views
14

Desidero qualche funzione di ricerca nel mio sito web. Nella pagina di output, ottengo tutti i risultati in una singola pagina. Tuttavia, voglio distribuirlo su molte pagine (cioè 100 ricerche/pagina). Per questo, sto passando un numero di ricerche di default in "urlfor" ma non funziona. So che sto facendo un piccolo errore ma non lo sto prendendo.Gestione dei parametri dell'URL (Python Flask)

Ecco il mio codice qui sotto:

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

qui voglio uscita sul URL del tipo "http://127.0.0.1:5000/my_search/assets?results1=0-100" Inoltre, se posso modificare l'indirizzo URL nel browser come voglio la prossima 100 Risultato posso farlo "http://127.0.0.1:5000/my_search/assets?results1=100-100"

Nota: qui sto usando sqlite come backend; quindi userò "limit_factor" nelle mie query per limitare i miei risultati. E "query_builder" e "query_builder_count" sono semplici funzioni che generano query sql complesse.

ma l'errore che sto ottenendo è "NoneType" non può avere split. Si è fermato a "limit_factor".

Qui il fattore limite è solo un filtro che ho applicato; ma voglio applicare più filtri, ad esempio voglio cercare per la sua posizione "http://127.0.0.1:5000/my_search/assets?results1=0-100&location=asia"

risposta

32

I parametri di funzione sono mappati solo alle variabili di percorso. Ciò significa che nel tuo caso la funzione show_results dovrebbe avere un solo parametro e cioè labelname. Non è nemmeno necessario impostarlo su None, perché deve essere sempre impostato (altrimenti il ​​percorso non corrisponderà).

Al fine di ottenere i parametri di query, utilizzare 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, è meglio non costruire il vostro SQL il modo di fare, uso segnaposto e variabili. Il tuo codice è vulnerabile allo SQL injection. Non puoi fidarti di nessun input che proviene dall'utente.

Il modo corretto per fare questo dipende dal database vero e proprio, ma per esempio se si utilizza MySQL, si dovrebbe fare questo (non che io non sto usando l'operatore %):

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

eccellente .. . sta funzionando.. . e sì hai ragione; lo sto rendendo vulnerabile all'iniezione SQL, sostituirò tutti loro; ma a partire da ora, sto usando regex per filtrare tutti gli input dell'utente !!! – namit

Problemi correlati