Problemi di Python Routes utilizzando Flask
Ho la seguente funzione con più percorsi possibili:
@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)
Tutti i percorsi funzionano bene, tranne l'ultimo. Ho l'URL come questo:
http://192.168.10.88:5000/list/lot/OLDER/NEW?search=test
E non capisco perché, la stampa torna sempre None.
Qualche idea ?
Grazie
Risposte
Puoi usare requesto request.query_stringse vuoi ottenere la stringa di query:
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'
Osservazioni come ho usato requestper ottenere il valore di ricerca: request.args.get('search').
Ecco un altro approccio che trovo più semplice e pulito:
@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 ha questo aspetto:
http://192.168.10.88:5000/list/lot/parameters?time=OLDER&status=NEW&search=test
La parte dopo la ?è la stringa della query. Sono sicuro al 99% che Flask rimuove la stringa di query quando si abbinano i percorsi (non ho potuto confermarlo nei documenti, quindi l'1%). Ciò significa che i seguenti URL sono identici quando si abbina un percorso.
http://192.168.10.88:5000/list/lot/OLDER/NEW?search=test
http://192.168.10.88:5000/list/lot/OLDER/NEW
Un altro modo per fare quello che (penso) stai cercando di fare è usare la stringa di query per tutte le tue variabili.
@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)