Come posso ottenere i parametri nominati da un URL usando Flask?


369

Quando l'utente accede a questo URL in esecuzione sulla mia app di pallone, voglio che il servizio Web sia in grado di gestire i parametri specificati dopo il punto interrogativo:

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
Solo un piccolo suggerimento per la sicurezza: non includere le password nelle richieste GET. security.stackexchange.com/questions/147188/…
palsch

6
Un altro piccolo suggerimento per la sicurezza: non inviare password agli endpoint HTTP (sempre solo HTTPS)
DerMike,

Risposte:


593

Utilizzare request.argsper ottenere contenuti analizzati della stringa di query:

from flask import request

@app.route(...)
def login():
    username = request.args.get('username')
    password = request.args.get('password')

1
Come si confronta con l'utilizzo dei parametri in app.route('/username=<username>&password=<password>')? In questo modo non scrivi affatto le righe request.args.get.
multigoodverse

@multigoodverse vedi il primo commento sulla domanda per cui non dovresti inviare una password tramite GET (nell'URL). Più in generale, una richiesta GET dovrebbe avere un ?all'inizio dei parametri, quindi si vorrebbe app.route('/?username=<username>&password=<password>'), ma Flask leggerà tutto dopo il punto interrogativo request.argse non interpreterà le variabili dalla rotta. Se vuoi arrivare al tuo percorso di esempio usando un modulo HTML, avrai bisogno di un mucchio di JavaScript extra per farlo funzionare. Infine, le variabili di percorso sono obbligatorie, request.argspossono essere facoltative.
Dericke,

146

I parametri URL sono disponibili in request.args, che è un ImmutableMultiDict che ha un getmetodo, con parametri opzionali per valore predefinito ( default) e tipo ( type) - che è un callable che converte il valore di input nel formato desiderato. (Vedi la documentazione del metodo per maggiori dettagli.)

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)

Esempi con il codice sopra:

/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. Questa è una risposta eccezionale! Non so se dovrei amare il pallone per questa funzione o il tuo codice, ma questo è ESATTAMENTE quello che stavo cercando per analizzare il mio input URL.
frakman1,

2
filterè una parola riservata, non dovrebbe usare;)
Ivan Camilito Ramirez Verdes

89

È inoltre possibile utilizzare le parentesi <> sull'URL della definizione della vista e questo input verrà inserito negli argomenti della funzione di visualizzazione

@app.route('/<name>')
def my_view_func(name):
    return name

1
Penso che questa dovrebbe essere la risposta poiché è ciò che serve per la documentazione de flask
Nathan Gavenski,

31

Se hai un singolo argomento passato nell'URL, puoi farlo come segue

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)

Nel caso abbiate più parametri:

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

Quello che stavi cercando di fare funziona in caso di richieste POST in cui i parametri vengono passati come parametri del modulo e non compaiono nell'URL. Nel caso in cui si stia effettivamente sviluppando un'API di accesso, è consigliabile utilizzare la richiesta POST anziché GET ed esporre i dati all'utente.

In caso di richiesta post, funzionerebbe come segue:

#url
http://10.1.1.1:5000/login

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

Itinerario:

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/

codice:

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

(Modifica: spazi rimossi nella stringa di formato)


-1

È davvero semplice Vorrei dividere questo processo in due semplici passaggi.

  1. Sul modello html dichiarerai il nome tag per nome utente e password come

    <form method="POST">
    <input type="text" name="user_name"></input>
    <input type="text" name="password"></input>
    </form>
  2. Quindi, modifica il codice come:

    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

Utilizzare request.args.get(param), ad esempio:

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)

Ecco il link di riferimento al codice.


Non esporre mai un nome utente e una password del genere! Vedi i commenti di palsh e DerMike 'su TS.
Bas van Ommen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.