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)

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

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: '*'

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

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)

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)


-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

-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.


Nigdy nie ujawniaj takiej nazwy użytkownika i hasła! Zobacz komentarze palsh i DerMike na temat TS.
— Bas van Ommen
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.