¿Cómo se obtiene una cadena de consulta en Flask?

409

No es obvio por la documentación del matraz sobre cómo obtener la cadena de consulta. Soy nuevo, miré los documentos, no pude encontrar!

Entonces

@app.route('/')
@app.route('/data')
def data():
    query_string=??????
    return render_template("data.html")
Tampa
fuente
11
Está en la documentación bajo inicio rápido: flask.pocoo.org/docs/quickstart/#the-request-object
Jarus
Pero, no usa el término 'cadena de consulta'. Simplemente los llama parámetros. > Para acceder a los parámetros enviados en la URL (? Clave = valor) puede usar el atributo args:>> searchword = request.args.get ('clave', '')
Ion Freeman

Respuestas:

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
fuente
70
Este ejemplo devuelve ese valor del parámetro "usuario" pasado en la cadena de consulta, no la cadena de consulta en sí. "Cadena de consulta" significa todo después del signo de interrogación y antes del signo de número, si hay uno presente.
Lyndsy Simon el
45
Todavía es una respuesta útil, considere que está relacionada con la pregunta. Tan válido y +1
Necronet
8
No, como con un dict y .get, simplemente obtendría None.
JPEG_
55
@LyndsySimon: Bien visto. Pero dado que esta respuesta responde correctamente la pregunta a la que aludían mis términos de búsqueda de Google ('parámetro de solicitud de obtención de matraz'), de todos modos, estoy votando. También soy pedante, pero lo atribuyo al misticismo web. 😉
Michael Scheper
55
No hay argumento de mi parte! Mis comentarios sobre esta pregunta han sido una fuente continua de puntos SO y karma general. :) ¡Feliz pirateo!
Lyndsy Simon
237

La URL completa está disponible como request.url, y la cadena de consulta está disponible como request.query_string.

Aquí hay un ejemplo:

from flask import request

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

    return request.query_string

Para acceder a un parámetro conocido individual pasado en la cadena de consulta, puede usar request.args.get('param'). Esta es la forma "correcta" de hacerlo, que yo sepa.

ETA: Antes de continuar, debe preguntarse por qué desea la cadena de consulta. Nunca he tenido que tirar de la cadena sin procesar: Flask tiene mecanismos para acceder a ella de manera abstracta. Debe usarlos a menos que tenga una razón convincente para no hacerlo.

Lyndsy Simon
fuente
11
+1 para la respuesta correcta real. Los flujos de OAuth como Dropbox solicitarán regularmente URL de redireccionamiento para pasar tokens. Tiene mucho sentido que desee analizar la cadena de consulta usted mismo.
Richard Løvehjerte
Un virtual -1 para la respuesta incorrecta 😉. Aunque literalmente correcto, no proporciona lo que el OP estaba buscando, lo que sí proporciona la respuesta aceptada. DWIM FTW. Bien jugado como un imán de puntos SO sin embargo.
Dave
15

Werkzeug / Flask ya lo analizó todo por usted. No es necesario volver a hacer el mismo trabajo con 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 documentación completa para los objetos de solicitud y respuesta se encuentra en Werkzeug: http://werkzeug.pocoo.org/docs/wrappers/

Simon Sapin
fuente
14

Podemos hacer esto usando request.query_string.

Ejemplo:

Consideremos 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())

También lo hace más modular utilizando Flask Blueprints - http://flask.pocoo.org/docs/0.10/blueprints/

Consideremos que el nombre se pasa como parte de la cadena de consulta / 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

Como puede ver, este es solo un pequeño ejemplo: puede obtener múltiples valores + formatearlos y usarlos o pasarlos al archivo de plantilla.

Sonda Pralhad Narsinh
fuente
11

Vine aquí buscando la cadena de consulta, no cómo obtener valores de la cadena de consulta.

request.query_string devuelve los parámetros de URL como una cadena de bytes sin procesar (Ref. 1).

Ejemplo de uso 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)

Salida:

parámetros de consulta en la ruta del matraz

Referencias

  1. Documentación oficial de la API en query_string
Michael Ribbons
fuente
1
Esta debería ser la respuesta aceptada, ya que proporciona la solución exacta que estaba buscando el OP.
Constt
Es difícil luchar con +600 en una respuesta algo imprecisa.
Marvin
4

Pruebe así para la cadena de consulta:

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)

Salida: ingrese la descripción de la imagen aquí

Sankar guru
fuente
request.args ['args1'] se escribe mejor como request.args.get ('args1')
imbatman
1

Todas las formas de la cadena de consulta recuperable del objeto de solicitud de matraz como se describe en O'Reilly Flask Web Devleopment :

Desde el desarrollo web O'Reilly Flask , y como dijo Manan Gouhari anteriormente, primero debe importar la solicitud:

from flask import request

requestes un objeto expuesto por Flask como una variable de contexto llamada (lo has adivinado) request. Como su nombre lo indica, contiene toda la información que el cliente incluyó en la solicitud HTTP. Este objeto tiene muchos atributos y métodos que puede recuperar y llamar, respectivamente.

Tiene bastantes requestatributos que contienen la cadena de consulta para elegir. Aquí enumeraré cada atributo que contiene de alguna manera la cadena de consulta, así como una descripción del libro de O'Reilly de ese atributo.

Primero está argscuál es "un diccionario con todos los argumentos pasados ​​en la cadena de consulta de la URL". Entonces, si desea que la cadena de consulta se analice en un diccionario, haría algo como esto:

from flask import request

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

(Como otros han señalado, también puede usar .get('<arg_name>')para obtener un valor específico del diccionario)

Luego, está el formatributo, que no contiene la cadena de consulta, pero que se incluye en parte de otro atributo que incluye la cadena de consulta que enumeraré momentáneamente. Primero, sin embargo, formes "Un diccionario con todos los campos de formulario enviados con la solicitud". Lo digo para decir esto: hay otro atributo de diccionario disponible en el objeto de solicitud de matraz llamado values. valueses "Un diccionario que combina los valores en formy args". Recuperar eso se vería así:

from flask import request

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

(Nuevamente, use .get('<arg_name>')para sacar un elemento específico del diccionario)

Otra opción es query_string"La parte de la cadena de consulta de la URL, como un valor binario sin formato". Ejemplo de eso:

from flask import request

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

Luego, como una ventaja adicional, existe full_pathcuál es "La ruta y las porciones de cadena de consulta de la URL". Por ejemplo:

from flask import request

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

Y finalmente, url"La URL completa solicitada por el cliente" (que incluye la cadena de consulta):

from flask import request

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

Feliz pirateo :)

23r0c001
fuente
0

Esto se puede hacer usando request.args.get(). Por ejemplo, si su cadena de consulta tiene un campo date, se puede acceder usando

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

No olvide agregar " request" a la lista de importaciones desde el matraz, es decir

from flask import request
Manan Gouhari
fuente
Si bien su respuesta es técnicamente correcta, ya hay otras respuestas (más antiguas y más completas) que sugieren utilizar request.args.get(); Las nuevas respuestas a las preguntas anteriores deben contener algo que no se mencionó antes.
lfurini
0

Si la solicitud es GET y pasamos algunos parámetros de consulta, entonces,

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
fuente