2012-10-13 278 views
14

Deseo tener alguna función de búsqueda en mi sitio web. En la página de salida, obtengo todos los resultados en una sola página. Sin embargo, quiero distribuirlo a muchas páginas (es decir, 100 búsquedas/página). Para eso, estoy pasando una serie de búsquedas predeterminadas en "urlfor" pero no está funcionando. Sé que estoy cometiendo un pequeño error, pero no lo estoy captando.Administración de parámetros de URL (Python Flask)

Aquí está mi código de abajo:

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

aquí quiero salida en la URL como "http://127.0.0.1:5000/my_search/assets?results1=0-100" Además, si puedo editar la dirección URL en el navegador como que quieren que el próximo 100 resultado puedo conseguirlo en "http://127.0.0.1:5000/my_search/assets?results1=100-100"

Nota: aquí estoy usando sqlite como back-end; entonces usaré "limit_factor" en mis consultas para limitar mis resultados. Y "query_builder" y "query_builder_count" son solo funciones simples que generan consultas SQL complejas.

pero el error que obtengo es "NoneType" no puede haberse dividido. Se detuvo en "limit_factor".

Aquí el factor de límite es solo un filtro que he aplicado; pero quiero aplicar más filtros, por ejemplo, quiero buscar por su ubicación "http://127.0.0.1:5000/my_search/assets?results1=0-100&location=asia"

Respuesta

32

Los parámetros de función se asignan solo a las variables de ruta. Eso significa que en su caso, la función show_results debe tener solo un parámetro y eso es labelname. Ni siquiera tiene que configurarlo por defecto a None, porque siempre tiene que configurarse (de lo contrario, la ruta no coincidirá).

el fin de obtener los parámetros de la consulta, utilice flask.request.args:

from flask import request 

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

Por cierto, es mejor que no construye su SQL de la manera que lo hace, los marcadores de posición de uso y variables. Su código es vulnerable al SQL injection. No puede confiar en ninguna entrada que provenga del usuario.

La forma correcta de hacer esto depende de la base de datos real, pero por ejemplo si utiliza MySQL, podría hacer esto (no es que no estoy usando el operador %):

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

Excelente .. . esta funcionando.. . y sí, tienes razón; Lo estoy haciendo vulnerable a la inyección de SQL; los reemplazaré a todos; pero a partir de ahora, estoy usando regex para filtrar todas las entradas de usuario !!! – namit

Cuestiones relacionadas