Comment obtenir une chaîne de requête sur Flask?

409

Pas évident dans la documentation de la fiole sur la façon d'obtenir la chaîne de requête. Je suis nouveau, j'ai regardé les documents, je n'ai pas pu trouver!

Donc

@app.route('/')
@app.route('/data')
def data():
    query_string=??????
    return render_template("data.html")
Tampa
la source
11
Il est dans la documentation sous QuickStart: flask.pocoo.org/docs/quickstart/#the-request-object
Jarus
Mais, il n'utilise pas le terme «chaîne de requête». Il les appelle simplement des paramètres. > Pour accéder aux paramètres soumis dans l'URL (? Key = value), vous pouvez utiliser l'attribut args:>> searchword = request.args.get ('key', '')
Ion Freeman

Réponses:

779
from flask import request

@app.route('/data')
def data():
    # here we want to get the value of user (i.e. ?user=some-value)
    user = request.args.get('user')
Kracekumar
la source
70
Cet exemple renvoie la valeur du paramètre "user" passée dans la chaîne de requête, pas la chaîne de requête elle-même. "Chaîne de requête" signifie tout ce qui se trouve après le point d'interrogation et avant le signe dièse, s'il y en a un.
Lyndsy Simon
45
est encore une réponse utile à considérer qu'elle est liée à la question. Donc valide et +1
Necronet
8
Non - comme avec un dict et un .get, vous obtiendrez simplement None.
JPEG_
5
@LyndsySimon: Bien repéré. Mais comme cette réponse répond correctement à la question à laquelle mes termes de recherche Google ont fait allusion (`` paramètre de demande d'obtention de flacon ''), je vote de toute façon. Je suis aussi un pédant, mais je mets cela au mysticisme du Web. 😉
Michael Scheper
5
Aucun argument de ma part! Mes commentaires sur cette question ont été une source permanente de points SO et de karma global. :) Joyeux piratage!
Lyndsy Simon
237

L'URL complète est disponible en tant que request.urlet la chaîne de requête est disponible en tant que request.query_string.

Voici un exemple:

from flask import request

@app.route('/adhoc_test/')
def adhoc_test():

    return request.query_string

Pour accéder à un paramètre connu individuel passé dans la chaîne de requête, vous pouvez utiliser request.args.get('param'). Pour autant que je sache, c'est la "bonne" façon de procéder.

ETA: Avant d'aller plus loin, vous devez vous demander pourquoi vous voulez la chaîne de requête. Je n'ai jamais eu à extraire la chaîne brute - Flask a des mécanismes pour y accéder de manière abstraite. Vous devez les utiliser, sauf si vous avez une raison impérieuse de ne pas le faire.

Lyndsy Simon
la source
11
+1 pour la bonne réponse réelle. Les flux OAuth tels que Dropbox demanderont régulièrement des URL de redirection vers lesquelles passer des jetons. Il est parfaitement logique que vous souhaitiez analyser la chaîne de requête vous-même.
Richard Løvehjerte
Un -1 virtuel pour la mauvaise réponse 😉. Bien que littéralement correct, il ne fournit pas ce que le PO recherchait, ce que fait la réponse acceptée. DWIM FTW. Bien joué en tant qu'aimant de points SO cependant.
Dave
15

Werkzeug / Flask a déjà tout analysé pour vous. Plus besoin de refaire le même travail avec urlparse:

from flask import request

@app.route('/')
@app.route('/data')
def data():
    query_string = request.query_string  ## There is it
    return render_template("data.html")

La documentation complète pour les objets de demande et de réponse se trouve dans Werkzeug: http://werkzeug.pocoo.org/docs/wrappers/

Simon Sapin
la source
14

Nous pouvons le faire en utilisant request.query_string.

Exemple:

Considérons view.py

from my_script import get_url_params

@app.route('/web_url/', methods=('get', 'post'))
def get_url_params_index():
    return Response(get_url_params())

Vous le rendez également plus modulaire en utilisant Flask Blueprints - http://flask.pocoo.org/docs/0.10/blueprints/

Considérons que le prénom est passé en tant que partie de la chaîne de requête / web_url /? First_name = john

## here is my_script.py

## import required flask packages
from flask import request
def get_url_params():
    ## you might further need to format the URL params through escape.    
    firstName = request.args.get('first_name') 
    return firstName

Comme vous le voyez, ce n'est qu'un petit exemple - vous pouvez récupérer plusieurs valeurs + les formater et les utiliser ou les transmettre au fichier modèle.

Pralhad Narsinh Sonar
la source
11

Je suis venu ici à la recherche de la chaîne de requête, pas comment obtenir des valeurs de la chaîne de requête.

request.query_string renvoie les paramètres d'URL sous forme de chaîne d'octets bruts (Réf 1).

Exemple d'utilisation request.query_string:

from flask import Flask, request

app = Flask(__name__)

@app.route('/data', methods=['GET'])
def get_query_string():
    return request.query_string

if __name__ == '__main__':
    app.run(debug=True)

Production:

paramètres de requête dans la route Flask

Références:

  1. Documentation officielle de l'API sur query_string
Michael Ribbons
la source
1
Cela devrait être la réponse acceptée car elle donne la solution exacte que le PO recherchait.
constt
Il est difficile de se battre avec +600 sur une réponse quelque peu inexacte.
Marvin
4

Essayez comme ceci pour la chaîne de requête:

from flask import Flask, request

app = Flask(__name__)

@app.route('/parameters', methods=['GET'])
def query_strings():

    args1 = request.args['args1']
    args2 = request.args['args2']
    args3 = request.args['args3']

    return '''<h1>The Query String are...{}:{}:{}</h1>''' .format(args1,args2,args3)


if __name__ == '__main__':

    app.run(debug=True)

Production: entrez la description de l'image ici

Gourou Sankar
la source
request.args ['args1'] est mieux écrit comme request.args.get ('args1')
imbatman
1

Chaque forme de la chaîne de requête récupérable à partir de l'objet de demande de flacon, comme décrit dans O'Reilly Flask Web Devleopment :

De O'Reilly Flask Web Development , et comme indiqué précédemment par Manan Gouhari, vous devez d'abord importer la demande:

from flask import request

requestest un objet exposé par Flask comme une variable de contexte nommée (vous l'avez deviné) request. Comme son nom l'indique, il contient toutes les informations que le client a incluses dans la requête HTTP. Cet objet possède de nombreux attributs et méthodes que vous pouvez récupérer et appeler, respectivement.

Vous avez plusieurs requestattributs qui contiennent la chaîne de requête parmi laquelle choisir. Ici, je vais lister chaque attribut qui contient de quelque manière que ce soit la chaîne de requête, ainsi qu'une description du livre O'Reilly de cet attribut.

Il y a d'abord argsqui est "un dictionnaire avec tous les arguments passés dans la chaîne de requête de l'URL". Donc, si vous voulez que la chaîne de requête soit analysée dans un dictionnaire, vous feriez quelque chose comme ceci:

from flask import request

@app.route('/'):
    queryStringDict = request.args

(Comme d'autres l'ont souligné, vous pouvez également utiliser .get('<arg_name>')pour obtenir une valeur spécifique du dictionnaire)

Ensuite, il y a l' formattribut, qui ne pas contenir la chaîne de requête, mais qui figure dans la partie d'un autre attribut qui ne comprend la chaîne de requête que je vais énumérer quelques instants. Tout d'abord, cependant, form"Un dictionnaire avec tous les champs du formulaire soumis avec la demande". Je dis cela pour dire ceci: il y a un autre attribut de dictionnaire disponible dans l'objet de demande de flacon appelé values. valuesest "Un dictionnaire qui combine les valeurs dans formetargs ." La récupération ressemblerait à ceci:

from flask import request

@app.route('/'):
    formFieldsAndQueryStringDict = request.values

(Encore une fois, utilisez .get('<arg_name>') pour obtenir un élément spécifique du dictionnaire)

Une autre option est celle query_stringqui est «La partie chaîne de requête de l'URL, en tant que valeur binaire brute». Exemple de cela:

from flask import request

@app.route('/'):
    queryStringRaw = request.query_string

Ensuite, comme bonus supplémentaire, il y a full_path"Le chemin et les parties de chaîne de requête de l'URL". Por ejemplo:

from flask import request

@app.route('/'):
    pathWithQueryString = request.full_path

Et enfin, url"L'URL complète demandée par le client" (qui inclut la chaîne de requête):

from flask import request

@app.route('/'):
    pathWithQueryString = request.url

Joyeux piratage :)

23r0c001
la source
0

Cela peut être fait en utilisant request.args.get(). Par exemple, si votre chaîne de requête contient un champ date, vous pouvez y accéder en utilisant

date = request.args.get('date')

N'oubliez pas d'ajouter " request" à la liste des importations à partir du flacon, c'est-à-dire

from flask import request
Manan Gouhari
la source
Bien que votre réponse soit techniquement correcte, il existe déjà d'autres réponses (plus anciennes et plus complètes) suggérant d'utiliser request.args.get(); les nouvelles réponses aux anciennes questions devraient contenir quelque chose qui n'a pas été mentionné auparavant.
lfurini
0

Si la demande si GET et nous avons passé certains paramètres de requête,

fro`enter code here`m flask import request
@app.route('/')
@app.route('/data')
def data():
   if request.method == 'GET':
      # Get the parameters by key
      arg1 = request.args.get('arg1')
      arg2 = request.args.get('arg2')
      # Generate the query string
      query_string="?arg1={0}&arg2={1}".format(arg1, arg2)
      return render_template("data.html", query_string=query_string)
RAJAHMAD MULANI
la source