Problemas de Python Routes usando Flask
Tengo la siguiente función con múltiples rutas posibles:
@bp.route('/list/', defaults={'status': None, 'time': None, 'search': None})
@bp.route('/list/lot/', defaults={'status': None, 'search': None, 'time': None})
@bp.route('/list/lot/<string:time>/', defaults={'status': None, 'search': None})
@bp.route('/list/lot/<string:time>/<string:status>', defaults={'search': None})
@bp.route('/list/lot/<string:time>/<string:status>?search=<path:search>')
@login_required
def index(status, time, search):
print(search)
Todas las rutas funcionan bien, excepto la última. Tengo la URL como esta:
http://192.168.10.88:5000/list/lot/OLDER/NEW?search=test
Y no entiendo por qué, la impresión siempre vuelve None.
Algunas ideas ?
Gracias
Respuestas
Puede usar requesto request.query_stringsi desea obtener la cadena de consulta:
from flask import request
@bp.route('/list/', defaults={'status': None, 'time': None, 'search': None})
@bp.route('/list/lot/', defaults={'status': None, 'search': None, 'time': None})
@bp.route('/list/lot/<string:time>/', defaults={'status': None, 'search': None})
@bp.route('/list/lot/<string:time>/<string:status>', defaults={'search': None})
@bp.route('/list/lot/<string:time>/<string:status>?search=<path:search>')
@login_required
def index(status, time, search):
print(request.query_string, request.args.get('search'), time, status)
# b'search=test' test OLDER NEW
return 'OK'
A destacar cómo he utilizado requestpara obtener el valor de búsqueda: request.args.get('search').
Aquí hay otro enfoque que encuentro más simple y limpio:
@bp.route('/list/lot/parameters')
@login_required
def index():
print(request.args.get('time'), request.args.get('status'), request.args.get('search'))
return 'OK'
La URL tiene este aspecto:
http://192.168.10.88:5000/list/lot/parameters?time=OLDER&status=NEW&search=test
La parte después de ?es la cadena de consulta. Estoy 99% seguro de que Flask elimina la cadena de consulta al hacer coincidir las rutas (no pude confirmar esto en los documentos, de ahí el 1%). Esto significa que las siguientes URL son idénticas al hacer coincidir una ruta.
http://192.168.10.88:5000/list/lot/OLDER/NEW?search=test
http://192.168.10.88:5000/list/lot/OLDER/NEW
Otra forma de hacer lo que (creo) está tratando de hacer es usar la cadena de consulta para todas sus variables.
@bp.route('/list/')
@bp.route('/list/lot/')
@login_required
def index():
status = request.args.get('status', default=None)
time = request.args.get('time', default=None)
search = request.args.get('search', default=None)
print(search)