¿Cómo puedo obtener los parámetros con nombre de una URL usando Flask?


369

Cuando el usuario accede a esta URL que se ejecuta en mi aplicación de matraz, quiero que el servicio web pueda manejar los parámetros especificados después del signo de interrogación:

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 una pequeña pista de seguridad: no incluya contraseñas en las solicitudes GET. security.stackexchange.com/questions/147188/…
— palsch

66
Otro pequeño consejo para la seguridad: no envíe contraseñas a puntos finales HTTP (solo HTTPS)
— DerMike

Respuestas:


593

Use request.argspara obtener el contenido analizado de la cadena de consulta:

from flask import request

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

1
¿Cómo se compara eso con el uso de parámetros en app.route('/username=<username>&password=<password>')? De esa manera no escribes las líneas request.args.get en absoluto.
— multigoodverse

@multigoodverse vea el primer comentario sobre la pregunta de por qué no debe enviar una contraseña a través de un GET (en la URL). En términos más generales, una solicitud GET debe tener un ?al comienzo de los parámetros, por lo que desearía app.route('/?username=<username>&password=<password>'), pero Flask leerá todo después del signo de interrogación request.argsy no interpretará las variables de la ruta. Si desea llegar a su ruta de ejemplo utilizando un formulario HTML, necesitaría un montón de JavaScript adicional para que funcione. Por último, las variables de ruta son obligatorias, request.argspueden ser opcionales.
— dericke

146

Los parámetros de URL están disponibles en request.args, que es un ImmutableMultiDict que tiene un getmétodo, con parámetros opcionales para el valor predeterminado ( default) y el tipo ( type), que es invocable y convierte el valor de entrada al formato deseado. (Consulte la documentación del método para obtener más detalles).

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)

Ejemplos con el código anterior:

/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. ¡Esta es una respuesta excelente! No sé si debería amar el matraz para esta función o su código, pero esto es EXACTAMENTE lo que estaba buscando para analizar mi entrada de URL.
— frakman1

2
filteres una palabra reservada, no debe usar;)
— Ivan Camilito Ramirez Verdes

89

También puede usar corchetes <> en la URL de la definición de vista y esta entrada irá a los argumentos de la función de vista

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

1
Creo que esta debería ser la respuesta, ya que es para lo que sirve la documentación de matraz
— Nathan Gavenski

31

Si tiene un único argumento pasado en la URL, puede hacerlo de la siguiente manera

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)

En caso de que tenga múltiples parámetros:

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

Lo que intentaba hacer funciona en caso de solicitudes POST donde los parámetros se pasan como parámetros de formulario y no aparecen en la URL. En caso de que realmente esté desarrollando una API de inicio de sesión, es recomendable que utilice la solicitud POST en lugar de GET y exponga los datos al usuario.

En caso de solicitud posterior, funcionaría de la siguiente manera:

#url
http://10.1.1.1:5000/login

Fragmento de 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>

Ruta:

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/

código:

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

(Editar: espacios eliminados en cadena de formato)


-1

Es muy simple Déjame dividir este proceso en dos simples pasos.

  1. En la plantilla html, declarará la etiqueta de nombre de usuario y contraseña como

    <form method="POST">
    <input type="text" name="user_name"></input>
    <input type="text" name="password"></input>
    </form>
  2. Luego, modifique su código como:

    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

Use request.args.get(param), por ejemplo:

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)

Aquí está el enlace referenciado al código.


¡Nunca exponga un nombre de usuario y contraseña como ese! Ver los comentarios de palsh y DerMike 'sobre TS.
— Bas van Ommen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.