Masalah Python Routes menggunakan Flask
Saya memiliki fungsi berikut dengan beberapa rute yang memungkinkan:
@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)
Semua rute berfungsi dengan baik, kecuali yang terakhir. Saya punya URL seperti ini:
http://192.168.10.88:5000/list/lot/OLDER/NEW?search=test
Dan saya tidak mengerti mengapa, cetakannya selalu kembali None.
Ada ide?
Terima kasih
Jawaban
Anda dapat menggunakan requestatau request.query_stringjika Anda ingin mendapatkan string kueri:
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'
komentar bagaimana saya menggunakan requestuntuk mendapatkan nilai pencarian: request.args.get('search').
Berikut adalah pendekatan lain yang menurut saya lebih sederhana dan lebih bersih:
@bp.route('/list/lot/parameters')
@login_required
def index():
print(request.args.get('time'), request.args.get('status'), request.args.get('search'))
return 'OK'
Url terlihat seperti ini:
http://192.168.10.88:5000/list/lot/parameters?time=OLDER&status=NEW&search=test
Bagian setelah ?adalah string kueri. Saya 99% yakin Flask menghapus string kueri saat mencocokkan rute (saya tidak bisa mengonfirmasi ini di dokumen karena itu 1%). Ini berarti url berikut identik saat mencocokkan rute.
http://192.168.10.88:5000/list/lot/OLDER/NEW?search=test
http://192.168.10.88:5000/list/lot/OLDER/NEW
Cara lain untuk melakukan apa (menurut saya) yang Anda coba lakukan adalah menggunakan string kueri untuk semua variabel Anda.
@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)