Problemas de rotas Python usando Flask
Tenho a seguinte função com várias rotas possíveis:
@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 as rotas funcionam bem, exceto a última. Tenho um URL como este:
http://192.168.10.88:5000/list/lot/OLDER/NEW?search=test
E não entendo porque, a estampa sempre volta None.
Alguma ideia ?
obrigado
Respostas
Você pode usar requestou request.query_stringse quiser obter a string 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'
observa como eu usei requestpara obter o valor de pesquisa: request.args.get('search').
Aqui está outra abordagem que considero mais simples e limpa:
@bp.route('/list/lot/parameters')
@login_required
def index():
print(request.args.get('time'), request.args.get('status'), request.args.get('search'))
return 'OK'
O URL é parecido com este:
http://192.168.10.88:5000/list/lot/parameters?time=OLDER&status=NEW&search=test
A parte depois de ?é a string de consulta. Tenho 99% de certeza que o Flask remove a string de consulta ao combinar rotas (não pude confirmar isso na documentação, portanto, o 1%). Isso significa que os seguintes urls são idênticos ao corresponder a uma rota.
http://192.168.10.88:5000/list/lot/OLDER/NEW?search=test
http://192.168.10.88:5000/list/lot/OLDER/NEW
Outra maneira de fazer o que (eu acho) que você está tentando fazer é usar a string de consulta para todas as suas variáveis.
@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)