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)

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

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

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

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)

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)


-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

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


Geben Sie niemals einen solchen Benutzernamen und ein solches Passwort bekannt! Siehe Palsh- und DerMike-Kommentare zu TS.
— Bas van Ommen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.