Jak mogę uzyskać nazwane parametry z adresu URL za pomocą Flask?

366

Gdy użytkownik uzyskuje dostęp do tego adresu URL działającego w mojej aplikacji flask, chcę, aby usługa internetowa mogła obsługiwać parametry określone po znaku zapytania:

http://10.1.1.1:5000/login?username=alex&password=pw1

#I just want to be able to manipulate the parameters
@app.route('/login', methods=['GET', 'POST'])
def login():
    username = request.form['username']
    print(username)
    password = request.form['password']
    print(password)
Alex Stone
źródło
89
Mała wskazówka dotycząca bezpieczeństwa: nie dołączaj haseł do żądań GET. security.stackexchange.com/questions/147188/…
palsch
6
Kolejna mała wskazówka dotycząca bezpieczeństwa: nie
wysyłaj

Odpowiedzi:

591

Służy request.argsdo pobierania przeanalizowanej zawartości ciągu zapytania:

from flask import request

@app.route(...)
def login():
    username = request.args.get('username')
    password = request.args.get('password')
falsetru
źródło
1
Jak to się ma do używania parametrów w app.route('/username=<username>&password=<password>')? W ten sposób nie piszesz w ogóle wierszy request.args.get.
multigoodverse
@multigoodverse zobacz pierwszy komentarz do pytania, dlaczego nie powinieneś wysyłać hasła przez GET (w adresie URL). Mówiąc bardziej ogólnie, żądanie GET powinno mieć ?na początku parametry, więc chciałbyś app.route('/?username=<username>&password=<password>'), ale Flask odczyta wszystko po znaku zapytania do request.argsi nie zinterpretuje zmiennych z trasy. Jeśli chcesz dostać się do swojej przykładowej trasy za pomocą formularza HTML, potrzebujesz dodatkowej obsługi JavaScript, aby działała. Wreszcie zmienne trasy są obowiązkowe, request.argsmogą być opcjonalne.
dericke
144

Parametry URL są dostępne w request.args, który jest ImmutableMultiDict, który ma getmetodę, z opcjonalnymi parametrami dla wartości domyślnej ( default) i type ( type) - która jest wywoływalna, która konwertuje wartość wejściową do pożądanego formatu. (Więcej informacji można znaleźć w dokumentacji metody ).

from flask import request

@app.route('/my-route')
def my_route():
  page = request.args.get('page', default = 1, type = int)
  filter = request.args.get('filter', default = '*', type = str)

Przykłady z powyższym kodem:

/my-route?page=34               -> page: 34  filter: '*'
/my-route                       -> page:  1  filter: '*'
/my-route?page=10&filter=test   -> page: 10  filter: 'test'
/my-route?page=10&filter=10     -> page: 10  filter: '10'
/my-route?page=*&filter=*       -> page:  1  filter: '*'
qqbenq
źródło
2
@ qqbenq. To wybitna odpowiedź! Nie wiem, czy powinienem lubić flask dla tej funkcji czy twojego kodu, ale właśnie tego dokładnie szukałem, aby przeanalizować dane wejściowe adresu URL.
frakman1
2
filterto słowo zastrzeżone, nie należy używać;)
Ivan Camilito Ramirez Verdes
88

Możesz także użyć nawiasów <> w adresie URL definicji widoku, a to wejście wejdzie w argumenty funkcji widoku

@app.route('/<name>')
def my_view_func(name):
    return name
Inbar Cheffer
źródło
1
Myślę, że taka powinna być odpowiedź, ponieważ o to chodzi w dokumentacji de flask
Nathan Gavenski
31

Jeśli w adresie URL podano jeden argument, możesz to zrobić w następujący sposób

from flask import request
#url
http://10.1.1.1:5000/login/alex

from flask import request
@app.route('/login/<username>', methods=['GET'])
def login(username):
    print(username)

W przypadku wielu parametrów:

#url
http://10.1.1.1:5000/login?username=alex&password=pw1

from flask import request
@app.route('/login', methods=['GET'])
    def login():
        username = request.args.get('username')
        print(username)
        password= request.args.get('password')
        print(password)

To, co próbujesz wykonać, działa w przypadku żądań POST, w których parametry są przekazywane jako parametry formularza i nie pojawiają się w adresie URL. W przypadku, gdy faktycznie tworzysz interfejs API logowania, zaleca się, abyś używał żądania POST zamiast GET i udostępniał dane użytkownikowi.

W przypadku żądania wysłania działałoby to w następujący sposób:

#url
http://10.1.1.1:5000/login

Fragment HTML:

<form action="http://10.1.1.1:5000/login" method="POST">
  Username : <input type="text" name="username"><br>
  Password : <input type="password" name="password"><br>
  <input type="submit" value="submit">
</form>

Trasa:

from flask import request
@app.route('/login', methods=['POST'])
    def login():
        username = request.form.get('username')
        print(username)
        password= request.form.get('password')
        print(password)
Suchita Mukherjee
źródło
11

URL:

http://0.0.0.0:5000/user/name/

kod:

@app.route('/user/<string:name>/', methods=['GET', 'POST'])
def user_view(name):
    print(name)

(Edycja: usunięte spacje w ciągu formatu)

Manish Sharma
źródło
-1

To jest naprawdę proste. Podzielę ten proces na dwa proste kroki.

  1. W szablonie HTML zadeklarujesz tag nazwy użytkownika i hasła jako

    <form method="POST">
    <input type="text" name="user_name"></input>
    <input type="text" name="password"></input>
    </form>
  2. Następnie zmodyfikuj kod jako:

    from flask import request
    
    @app.route('/my-route', methods=['POST']) #you should always parse username and 
    # password in a POST method not GET
    def my_route():
      username = request.form.get("user_name")
      print(username)
      password = request.form.get("password")
      print(password)
    #now manipulate the username and password variables as you wish
    #Tip: define another method instead of methods=['GET','POST'], if you want to  
    # render the same template with a GET request too
Mr.bunty
źródło
-2

Użyj request.args.get(param)na przykład:

http://10.1.1.1:5000/login?username=alex&password=pw1
@app.route('/login', methods=['GET', 'POST'])
def login():
    username = request.args.get('username')
    print(username)
    password = request.args.get('password')
    print(password)

Oto odnośnik do kodu.

RAJAHMAD MULANI
źródło
Nigdy nie ujawniaj takiej nazwy użytkownika i hasła! Zobacz komentarze palsh i DerMike na temat TS.
Bas van Ommen