Jak uzyskać ciąg zapytania w Flask?


408

Nie jest oczywiste z dokumentacji kolby, jak uzyskać ciąg zapytania. Jestem nowy, spojrzał na dokumenty, nie mógł znaleźć!

Więc

@app.route('/')
@app.route('/data')
def data():
    query_string=??????
    return render_template("data.html")

11
Jest w dokumentacji w przewodniku
Szybki

Ale nie używa terminu „ciąg zapytania”. To po prostu nazywa je parametrami. > Aby uzyskać dostęp do parametrów podanych w adresie URL (? Klucz = wartość), możesz użyć atrybutu args:>> searchword = request.args.get ('key', '')
Ion Freeman,

Odpowiedzi:


779
from flask import request

@app.route('/data')
def data():
    # here we want to get the value of user (i.e. ?user=some-value)
    user = request.args.get('user')

70
Ten przykład zwraca wartość parametru „user” przekazaną w ciągu zapytania, a nie sam ciąg zapytania. „Ciąg zapytania” oznacza wszystko po znaku zapytania i przed znakiem funta, jeśli jest obecny.
Lyndsy Simon

45
nadal jest przydatną odpowiedzią, biorąc pod uwagę, że jest to związane z pytaniem. Tak ważny i +1
Necronet,

8
Nie - tak jak w przypadku nagrania i .get, po prostu dostaniesz Brak.
JPEG_

5
@LyndsySimon: Dobrze zauważony. Ale ponieważ ta odpowiedź poprawnie odpowiada na pytanie, na które nawiązały moje wyszukiwane hasła Google („parametr żądania flask get”), i tak głosuję za nim. Ja też jestem pedantem, ale kreduję to mistycyzmem internetowym. 😉
Michael

5
Żadnych argumentów ode mnie! Moje komentarze do tego pytania były ciągłym źródłem punktów SO i ogólnej karmy. :) Miłego hakowania!
Lyndsy Simon

237

Pełny adres URL jest dostępny jako request.url, a ciąg zapytania jest dostępny jako request.query_string.

Oto przykład:

from flask import request

@app.route('/adhoc_test/')
def adhoc_test():

    return request.query_string

Aby uzyskać dostęp do pojedynczego znanego parametru przekazanego w ciągu zapytania, możesz użyć request.args.get('param'). O ile mi wiadomo, jest to „właściwy” sposób na zrobienie tego.

ETA: Zanim przejdziesz dalej, powinieneś zadać sobie pytanie, dlaczego chcesz ciąg zapytania. Nigdy nie musiałem wciągać surowego sznurka - Flask ma mechanizmy dostępu do niego w abstrakcyjny sposób. Powinieneś ich używać, chyba że masz ważny powód, aby tego nie robić.


11
+1 za właściwą właściwą odpowiedź. Przepływy OAuth, takie jak Dropbox, będą regularnie pytać o adresy URL przekierowań, do których będą przekazywane tokeny. Idealne jest, aby samemu przeanalizować ciąg zapytania.
Richard Løvehjerte

Wirtualny -1 za złą odpowiedź 😉. Chociaż dosłownie poprawne, nie zapewnia tego, czego szukał PO, co robi zaakceptowana odpowiedź. DWIM FTW. Dobrze się gra jako magnes na punkty SO.
Dave

15

Werkzeug / Flask as już wszystko przeanalizował. Nie musisz ponownie wykonywać tej samej pracy z urlparse:

from flask import request

@app.route('/')
@app.route('/data')
def data():
    query_string = request.query_string  ## There is it
    return render_template("data.html")

Pełna dokumentacja dla obiektów żądania i odpowiedzi znajduje się w Werkzeug: http://werkzeug.pocoo.org/docs/wrappers/


14

Możemy to zrobić za pomocą request.query_string.

Przykład:

Rozważmy view.py

from my_script import get_url_params

@app.route('/web_url/', methods=('get', 'post'))
def get_url_params_index():
    return Response(get_url_params())

Możesz także uczynić go bardziej modułowym, korzystając z Flask Blueprints - http://flask.pocoo.org/docs/0.10/blueprints/

Rozważmy, że imię jest przekazywane jako część ciągu zapytania / web_url /? First_name = john

## here is my_script.py

## import required flask packages
from flask import request
def get_url_params():
    ## you might further need to format the URL params through escape.    
    firstName = request.args.get('first_name') 
    return firstName

Jak widzisz, to tylko mały przykład - możesz pobrać wiele wartości, sformatować je i użyć lub przekazać do pliku szablonu.


11

Przybyłem tutaj, szukając ciągu zapytania, a nie jak uzyskać wartości z ciągu zapytania.

request.query_string zwraca parametry URL jako nieprzetworzony ciąg bajtów (Ref 1).

Przykład użycia request.query_string:

from flask import Flask, request

app = Flask(__name__)

@app.route('/data', methods=['GET'])
def get_query_string():
    return request.query_string

if __name__ == '__main__':
    app.run(debug=True)

Wynik:

parametry zapytania w trasie Flask

Bibliografia:

  1. Oficjalna dokumentacja API na zapytanie_string

1
To powinna być zaakceptowana odpowiedź, ponieważ daje dokładne rozwiązanie, którego szukał PO.
constt

Trudno walczyć z +600 przy nieco niedokładnej odpowiedzi.
Marvin

4

Spróbuj tak dla ciągu zapytania:

from flask import Flask, request

app = Flask(__name__)

@app.route('/parameters', methods=['GET'])
def query_strings():

    args1 = request.args['args1']
    args2 = request.args['args2']
    args3 = request.args['args3']

    return '''<h1>The Query String are...{}:{}:{}</h1>''' .format(args1,args2,args3)


if __name__ == '__main__':

    app.run(debug=True)

Wynik: wprowadź opis zdjęcia tutaj


request.args ['args1'] lepiej napisać jako request.args.get ('args1')
imbatman

1

Każda forma ciągu zapytania możliwa do odzyskania z obiektu żądania kolby, jak opisano w O'Reilly Flask Web Devleopment :

Z O'Reilly Flask Web Development i jak stwierdził wcześniej Manan Gouhari, najpierw musisz zaimportować żądanie:

from flask import request

requestjest obiektem ujawnionym przez Flask jako zmienna kontekstowa o nazwie (zgadłeś) request. Jak sama nazwa wskazuje, zawiera wszystkie informacje, które klient zawarł w żądaniu HTTP. Ten obiekt ma wiele atrybutów i metod, które można odpowiednio pobrać i wywołać.

Masz sporo request atrybutów, które zawierają ciąg zapytania do wyboru. Tutaj wymienię każdy atrybut, który w jakikolwiek sposób zawiera ciąg zapytania, a także opis z książki O'Reilly tego atrybutu.

Najpierw argsjest „słownik ze wszystkimi argumentami przekazanymi w ciągu zapytania adresu URL”. Więc jeśli chcesz, aby ciąg zapytania został przeanalizowany w słowniku, zrobiłbyś coś takiego:

from flask import request

@app.route('/'):
    queryStringDict = request.args

(Jak zauważyli inni, możesz również użyć, .get('<arg_name>')aby uzyskać określoną wartość ze słownika)

Następnie istnieje formatrybut, który nie zawiera ciągu zapytania, ale który jest zawarty w części innego atrybutu, który zawiera ciąg zapytania, który wymienię na chwilę. Najpierw formjest jednak „Słownik ze wszystkimi polami formularza przesłanymi wraz z żądaniem”. Mówię to tak: istnieje inny atrybut słownika dostępny w obiekcie żądania kolby o nazwie values. valuesto „Słownik, który łączy wartości w formi args”. Pobieranie, które wyglądałoby mniej więcej tak:

from flask import request

@app.route('/'):
    formFieldsAndQueryStringDict = request.values

(Ponownie, użyj, .get('<arg_name>')aby pobrać konkretny element ze słownika)

Inną opcją jest query_string„Część ciągu zapytania w adresie URL jako nieprzetworzona wartość binarna”. Przykład tego:

from flask import request

@app.route('/'):
    queryStringRaw = request.query_string

Następnie, jako dodatkowy bonus, istnieje full_path„Ścieżka i części ciągu zapytania w adresie URL”. Por ejemplo:

from flask import request

@app.route('/'):
    pathWithQueryString = request.full_path

I wreszcie: url„Pełny adres URL żądany przez klienta” (który zawiera ciąg zapytania):

from flask import request

@app.route('/'):
    pathWithQueryString = request.url

Miłego hakowania :)


0

Można to zrobić za pomocą request.args.get(). Na przykład, jeśli ciąg zapytania ma pole date, można uzyskać do niego dostęp za pomocą

date = request.args.get('date')

Nie zapomnij dodać „ request” do listy importów z kolby, tj

from flask import request

Chociaż Twoja odpowiedź jest technicznie poprawna, istnieją już inne odpowiedzi (starsze i bardziej kompletne) sugerujące użycie request.args.get(); nowe odpowiedzi na stare pytania powinny zawierać coś, o czym wcześniej nie wspomniano.
lfurini,

0

Jeśli żądanie GET i przekażemy niektóre parametry zapytania,

fro`enter code here`m flask import request
@app.route('/')
@app.route('/data')
def data():
   if request.method == 'GET':
      # Get the parameters by key
      arg1 = request.args.get('arg1')
      arg2 = request.args.get('arg2')
      # Generate the query string
      query_string="?arg1={0}&arg2={1}".format(arg1, arg2)
      return render_template("data.html", query_string=query_string)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.