Python Flask ¿cómo obtener parámetros de una URL?


En Flask, ¿Cómo puedo extraer parámetros de una URL? ¿Cómo puedo extraer parámetros con nombre de una URL usando flask y python?

Cuando el usuario accede a esta URL que se ejecuta en mi aplicación flask, quiero que el servicio web sea capaz de 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) 
Author: Eric Leschinski, 2014-07-22

4 answers

Uso request.args para 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')
 322
Author: falsetru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-28 15:50:29

Los parámetros de URL están disponibles en request.args, que es un MultiDict que tiene un método get, con parámetros opcionales para el valor predeterminado (default) y el tipo (type) - que es un llamable que convierte el valor de entrada al formato deseado.

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: '*'
 46
Author: qqbenq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-20 11:41:27

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

@app.route('/<name>')
def my_view_func(name):
    return name
 13
Author: Inbar Cheffer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-14 00:29:48

Si tiene un solo 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 estaba tratando de 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 aconsejable que use POST request en lugar de GET y exponer los datos al usuario.

En caso de solicitud post, funcionaría como sigue:

#url
http://10.1.1.1:5000/login

Fragmento HTML:

<form action="http://10.1.1.1:5000/login">
  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)
 5
Author: Suchita Mukherjee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-17 15:18:54