2012-10-13 23 views
14

Chcę korzystać z funkcji wyszukiwania w mojej witrynie. Na stronie wyjściowej otrzymuję wszystkie wyniki na jednej stronie. Jednak chcę rozpowszechniać go na wielu stronach (np. 100 wyszukiwań/strona). W tym celu przechodzę pewną liczbę domyślnych wyszukiwań w "urlfor", ale to nie działa. Wiem, że popełniam mały błąd, ale nie łapię go.Zarządzanie parametrami adresu URL (Python Flask)

Oto mój kod poniżej:

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

Chciałbym tu wyjście na URL jak „http://127.0.0.1:5000/my_search/assets?results1=0-100” Również, jeśli mogę zmienić adres URL w przeglądarce jak chcę następne 100 rezultat mogę go dostać na "http://127.0.0.1:5000/my_search/assets?results1=100-100"

Uwaga: tutaj używam sqlite jako backend; więc w moich zapytaniach będę używał "limit_factor", aby ograniczyć moje wyniki. "query_builder" i "query_builder_count" to tylko proste funkcje, które generują złożone zapytania SQL.

ale błąd, który otrzymuję, to "NoneType", nie można podzielić. Zatrzymał się pod adresem "limit_factor".

Tutaj współczynnik limitu to tylko jeden filtr, który zastosowałem; ale chcę zastosować więcej filtrów, na przykład chcę wyszukać według jego lokalizacji "http://127.0.0.1:5000/my_search/assets?results1=0-100&location=asia"

Odpowiedz

32

Parametry funkcji są mapowane tylko do zmiennych trasy. Oznacza to, że w twoim przypadku funkcja show_results powinna mieć tylko jeden parametr i jest to labelname. Nie musisz nawet ustawiać go domyślnie na None, ponieważ zawsze trzeba go ustawić (w przeciwnym razie trasa nie będzie pasować).

W celu uzyskania parametrów zapytania, użyj 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, nie lepiej budować swoją SQL sposób zrobić, użyj zastępczych i zmienne. Twój kod jest podatny na SQL injection. Nie można ufać żadnym wejściom pochodzącym od użytkownika.

Poprawny sposób to zrobić zależy od rzeczywistej bazy danych, ale na przykład w przypadku korzystania z MySQL, by to zrobić (nie, że nie używam operatora %):

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

Doskonała .. . to działa.. . i tak masz rację; Robię to podatny na wstrzyknięcie SQL, zastąpię je wszystkie; ale od teraz używam regex do filtrowania wszystkich wejść użytkownika !!! – namit

Powiązane problemy