¿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)
Alex Stone
fuente
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')
falsetru
fuente
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: '*'
qqbenq
fuente
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
Cheffer Inbar
fuente
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)
Suchita Mukherjee
fuente
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)

Manish Sharma
fuente
-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
Mr.bunty
fuente
-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.

RAJAHMAD MULANI
fuente
¡Nunca exponga un nombre de usuario y contraseña como ese! Ver los comentarios de palsh y DerMike 'sobre TS.
Bas van Ommen