Wie kann ich die benannten Parameter mit Flask von einer URL abrufen?

367

Wenn der Benutzer auf diese URL zugreift, die in meiner Flask-App ausgeführt wird, möchte ich, dass der Webdienst die nach dem Fragezeichen angegebenen Parameter verarbeiten kann:

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
quelle
89
Nur ein kleiner Hinweis zur Sicherheit: Fügen Sie keine Passwörter in GET-Anfragen ein. security.stackexchange.com/questions/147188/…
palsch
6
Ein weiterer kleiner Hinweis zur Sicherheit: Senden Sie keine Passwörter an HTTP-Endpunkte (immer nur HTTPS)
DerMike

Antworten:

593

Verwenden Sie request.argsdiese Option, um den analysierten Inhalt der Abfragezeichenfolge abzurufen:

from flask import request

@app.route(...)
def login():
    username = request.args.get('username')
    password = request.args.get('password')
falsetru
quelle
1
Wie ist das im Vergleich zur Verwendung von Parametern in app.route('/username=<username>&password=<password>')? Auf diese Weise schreiben Sie die Zeilen request.args.get überhaupt nicht.
Multigoodverse
@multigoodverse Lesen Sie den ersten Kommentar zu der Frage, warum Sie kein Passwort über ein GET (in der URL) senden sollten. Im Allgemeinen sollte eine GET-Anforderung ?am Anfang der Parameter ein haben, also möchten Sie app.route('/?username=<username>&password=<password>'), aber Flask liest alles nach dem Fragezeichen in request.argsund interpretiert die Variablen von der Route nicht. Wenn Sie mithilfe eines HTML-Formulars zu Ihrer Beispielroute gelangen möchten, benötigen Sie eine Reihe von zusätzlichem JavaScript, damit dies funktioniert. Schließlich sind Routenvariablen obligatorisch und request.argskönnen optional sein.
dericke
144

Die URL - Parameter sind in request.args, die eine ImmutableMultiDict , der eine hat getMethode, mit optionaler Parameter für Standardwert ( default) und Typ ( type) - die eine aufrufbare daß wandelt der Eingangswert in das gewünschte Format ist. ( Weitere Informationen finden Sie in der Dokumentation der Methode .)

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)

Beispiele mit dem obigen Code:

/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
quelle
2
@ qqbenq.This ist eine hervorragende Antwort! Ich weiß nicht, ob ich flask für diese Funktion oder Ihren Code lieben sollte, aber genau das habe ich gesucht, um meine URL-Eingabe zu analysieren.
frakman1
2
filterist ein reserviertes Wort, sollte nicht verwendet werden;)
Ivan Camilito Ramirez Verdes
88

Sie können auch Klammern <> für die URL der Ansichtsdefinition verwenden. Diese Eingabe wird in die Argumente Ihrer Ansichtsfunktion eingegeben

@app.route('/<name>')
def my_view_func(name):
    return name
Inbar Cheffer
quelle
1
Ich denke, dies sollte die Antwort sein, da es das ist, wofür die
Kolbendokumentation gilt
31

Wenn Sie ein einzelnes Argument in der URL übergeben haben, können Sie dies wie folgt tun

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)

Falls Sie mehrere Parameter haben:

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

Was Sie versucht haben, funktioniert bei POST-Anforderungen, bei denen Parameter als Formularparameter übergeben werden und nicht in der URL angezeigt werden. Wenn Sie tatsächlich eine Anmelde-API entwickeln, ist es ratsam, die POST-Anforderung anstelle von GET zu verwenden und die Daten dem Benutzer zur Verfügung zu stellen.

Im Falle einer Nachanfrage würde dies wie folgt funktionieren:

#url
http://10.1.1.1:5000/login

HTML-Snippet:

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

Route:

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
quelle
11

URL:

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

Code:

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

(Bearbeiten: Leerzeichen in Formatzeichenfolge entfernt)

Manish Sharma
quelle
-1

Es ist wirklich einfach. Lassen Sie mich diesen Prozess in zwei einfache Schritte unterteilen.

  1. In der HTML-Vorlage deklarieren Sie das Namensschild für Benutzername und Passwort als

    <form method="POST">
    <input type="text" name="user_name"></input>
    <input type="text" name="password"></input>
    </form>
  2. Ändern Sie dann Ihren Code wie folgt:

    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
quelle
-2

Verwenden Sie request.args.get(param)zum Beispiel:

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)

Hier ist der Link zum Code, auf den verwiesen wird.

RAJAHMAD MULANI
quelle
Geben Sie niemals einen solchen Benutzernamen und ein solches Passwort bekannt! Siehe Palsh- und DerMike-Kommentare zu TS.
Bas van Ommen