Comment puis-je obtenir les paramètres nommés à partir d'une URL à l'aide de Flask?

369

Lorsque l'utilisateur accède à cette URL en cours d'exécution sur mon application flask, je souhaite que le service Web puisse gérer les paramètres spécifiés après le point d'interrogation:

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
la source
89
Juste un petit indice pour la sécurité: n'incluez pas de mots de passe dans les requêtes GET. security.stackexchange.com/questions/147188/…
palsch
6
Un autre petit indice pour la sécurité: N'envoyez pas de mots de passe aux points de terminaison HTTP (uniquement HTTPS)
DerMike

Réponses:

593

Utilisez request.argspour obtenir le contenu analysé de la chaîne de requête:

from flask import request

@app.route(...)
def login():
    username = request.args.get('username')
    password = request.args.get('password')
falsetru
la source
1
Comment cela se compare-t-il à l'utilisation de paramètres dans app.route('/username=<username>&password=<password>')? De cette façon, vous n'écrivez pas du tout les lignes request.args.get.
multigoodverse
@multigoodverse voir le premier commentaire sur la question pour savoir pourquoi vous ne devriez pas envoyer un mot de passe via un GET (dans l'URL). Plus généralement, une requête GET devrait avoir un ?au début des paramètres, donc vous le voudriez app.route('/?username=<username>&password=<password>'), mais Flask lira tout après le point d'interrogation request.argset n'interprètera pas les variables de la route. Si vous souhaitez accéder à votre exemple d'itinéraire à l'aide d'un formulaire HTML, vous aurez besoin d'un tas de code JavaScript supplémentaire pour le faire fonctionner. Enfin, les variables de route sont obligatoires, request.argspeuvent être facultatives.
dericke
146

Les paramètres d'URL sont disponibles dans request.args, qui est un ImmutableMultiDict qui a une getméthode, avec des paramètres facultatifs pour la valeur par défaut ( default) et le type ( type) - qui est un appelable qui convertit la valeur d'entrée au format souhaité. (Voir la documentation de la méthode pour plus de détails.)

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)

Exemples avec le code ci-dessus:

/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
la source
2
@ qqbenq. C'est une réponse exceptionnelle! Je ne sais pas si je devrais aimer le flacon pour cette fonctionnalité ou votre code, mais c'est exactement ce que je cherchais pour analyser mon entrée URL.
frakman1
2
filterest un mot réservé, ne doit pas utiliser;)
Ivan Camilito Ramirez Verdes
89

Vous pouvez également utiliser des crochets <> sur l'URL de la définition de la vue et cette entrée ira dans les arguments de votre fonction de vue

@app.route('/<name>')
def my_view_func(name):
    return name
Inbar Cheffer
la source
1
Je pense que cela devrait être la réponse car c'est à cela que sert la documentation de flask
Nathan Gavenski
31

Si un seul argument est passé dans l'URL, vous pouvez le faire comme suit

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)

Si vous avez plusieurs paramètres:

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

Ce que vous essayez de faire fonctionne en cas de requêtes POST où les paramètres sont passés en tant que paramètres de formulaire et n'apparaissent pas dans l'URL. Dans le cas où vous développez réellement une API de connexion, il est conseillé d'utiliser la requête POST plutôt que GET et d'exposer les données à l'utilisateur.

En cas de demande de post, cela fonctionnerait comme suit:

#url
http://10.1.1.1:5000/login

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

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
la source
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)

(Modifier: espaces supprimés dans la chaîne de format)

Manish Sharma
la source
-1

C'est vraiment simple. Permettez-moi de diviser ce processus en deux étapes simples.

  1. Sur le modèle html, vous déclarerez la balise de nom pour le nom d'utilisateur et le mot de passe comme

    <form method="POST">
    <input type="text" name="user_name"></input>
    <input type="text" name="password"></input>
    </form>
  2. Ensuite, modifiez votre code comme:

    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
la source
-2

Utilisez request.args.get(param), par exemple:

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)

Voici le lien référencé vers le code.

RAJAHMAD MULANI
la source
N'exposez jamais un nom d'utilisateur et un mot de passe comme ça! Voir les commentaires de Palsh et DerMike sur TS.
Bas van Ommen