Problèmes liés aux routes Python avec Flask
J'ai la fonction suivante avec plusieurs itinéraires possibles:
@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)
Tous les itinéraires fonctionnent bien, sauf le dernier. J'ai l'URL aime ceci:
http://192.168.10.88:5000/list/lot/OLDER/NEW?search=test
Et je ne comprends pas pourquoi, l'impression revient toujours None.
Des idées ?
Merci
Réponses
Vous pouvez utiliser requestou request.query_stringsi vous souhaitez obtenir la chaîne de requête:
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'
Remarques comment je requestpour obtenir la valeur de la recherche: request.args.get('search').
Voici une autre approche que je trouve plus simple et plus propre:
@bp.route('/list/lot/parameters')
@login_required
def index():
print(request.args.get('time'), request.args.get('status'), request.args.get('search'))
return 'OK'
L'URL ressemble à ceci:
http://192.168.10.88:5000/list/lot/parameters?time=OLDER&status=NEW&search=test
La partie après le ?est la chaîne de requête. Je suis sûr à 99% que Flask supprime la chaîne de requête lors de la correspondance des itinéraires (je n'ai pas pu le confirmer dans la documentation, d'où le 1%). Cela signifie que les URL suivantes sont identiques lorsqu'elles correspondent à une route.
http://192.168.10.88:5000/list/lot/OLDER/NEW?search=test
http://192.168.10.88:5000/list/lot/OLDER/NEW
Une autre façon de faire ce que (je pense) que vous essayez de faire est d'utiliser la chaîne de requête pour toutes vos 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)