Probleme mit Python-Routen mit Flask
Ich habe folgende Funktion mit mehreren Routen möglich:
@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)
Alle Routen funktionieren gut, außer der letzten. Ich habe die URL wie folgt:
http://192.168.10.88:5000/list/lot/OLDER/NEW?search=test
Und ich verstehe nicht warum, der Druck kehrt immer zurück None.
Irgendwelche Ideen ?
Vielen Dank
Antworten
Sie können verwenden requestoder request.query_stringwenn Sie die Abfragezeichenfolge erhalten möchten:
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'
bemerkt, wie ich requestden Wert der Suche erhalten habe : request.args.get('search').
Hier ist ein weiterer Ansatz, den ich einfacher und sauberer finde:
@bp.route('/list/lot/parameters')
@login_required
def index():
print(request.args.get('time'), request.args.get('status'), request.args.get('search'))
return 'OK'
Die URL sieht folgendermaßen aus:
http://192.168.10.88:5000/list/lot/parameters?time=OLDER&status=NEW&search=test
Der Teil nach dem ?ist die Abfragezeichenfolge. Ich bin zu 99% sicher, dass Flask die Abfragezeichenfolge entfernt, wenn Routen abgeglichen werden (ich konnte dies in den Dokumenten nicht bestätigen, daher die 1%). Dies bedeutet, dass die folgenden URLs beim Abgleichen einer Route identisch sind.
http://192.168.10.88:5000/list/lot/OLDER/NEW?search=test
http://192.168.10.88:5000/list/lot/OLDER/NEW
Eine andere Möglichkeit, das zu tun, was Sie (glaube ich) versuchen, besteht darin, die Abfragezeichenfolge für alle Ihre Variablen zu verwenden.
@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)