Estoy tratando de pasar parámetros de consulta separados por comas a un punto final Flask.
Un ejemplo de URI sería:
localhost:3031/someresource#?status=1001,1002,1003
Mirando el retorno de request.args o request.args.getlist('status') veo que solo obtengo una cadena.
ipdb> pp request.args ImmutableMultiDict([('status', '1001,1002,1003')]) ipdb> request.args.getlist('status') ['1001,1002,1003']Sé que puedo dividir la cadena por coma, pero eso es demasiado complicado. ¿Cuál es la forma adecuada de manejar esto en Flask? ¿O mis parámetros de consulta tienen un formato incorrecto?
Solución
Dado que Flask no admite directamente parámetros de consulta separados por comas, incluí esto en mi controlador base para admitir parámetros de consulta duplicados o separados por comas en todos los puntos finales.
request_data = {} params = request.args.getlist('status') or request.form.getlist('status') if len(params) == 1 and ',' in params[0]: request_data['status'] = comma_separated_params_to_list(params[0])}) else: request_data['status'] = params def comma_separated_params_to_list(param): result = [] for val in param.split(','): if val: result.append(val) return resultNo es raro que el diseño de la API REST tenga comas para pasar múltiples valores para la misma clave, lo que lo hace más fácil para el usuario. De todos modos, está analizando argumentos GET, analizar cadenas no es mucho más complicado. Puede optar por generar un error HTTP 400 si su cadena con comas no está bien formateada.
Algunos otros lenguajes (especialmente PHP) admiten la sintaxis de 'matriz', por lo que a veces se usa:
/request?status[]=1000&status[]=1001&status[]=1002
La getlist la variante del flask espera varias claves:
from flask import Flask, request app = Flask(__name__) @app.route('/') def status(): first_status = request.args.get("status") statuses = request.args.getlist("status") return "First Status: '{}'\nAll Statuses: '{}'".format(first_status, statuses) ❯ curl "http://localhost:5000?status=5&status=7" First Status: '5' All Statuses: '['5', '7']'No hay un estándar para esto, la forma en que se analizan/aprueban varios argumentos GET depende del idioma/marco que esté utilizando; El matraz se basa en werkzeug , por lo que permite este estilo, pero tendrás que buscarlo si te alejas del matraz.
Esto es lo que podrías querer aquí:
request.arg.to_dict(flat=False) flat es True de forma predeterminada, por lo que al configurarlo en False, le permite devolver un dict con valores dentro de una lista cuando hay más de uno.
Según to_dict documentación:
to_dict(flat=True) Return the contents as regular dict. If flat is True the returned dict will only have the first item present, if flat is False all values will be returned as lists.