Flask kullanarak Python Routes sorunları

Oct 22 2020

Mümkün olan birden fazla rotayla aşağıdaki işleve sahibim:

@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)

Sonuncusu hariç tüm rotalar iyi çalışıyor. URL şuna benzer:

http://192.168.10.88:5000/list/lot/OLDER/NEW?search=test

Ve nedenini anlamıyorum, baskı her zaman geri geliyor None.

Herhangi bir fikir ?

Teşekkürler

Yanıtlar

1 Tobin Oct 22 2020 at 20:26

Sorgu dizesini almak istiyorsanız requestveya kullanabilirsiniz request.query_string:

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'

Ben nasıl kullandığını belirtiyor requestaramanın değerini almak için: request.args.get('search').

İşte daha basit ve daha temiz bulduğum başka bir yaklaşım:

@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 şöyle görünür:

http://192.168.10.88:5000/list/lot/parameters?time=OLDER&status=NEW&search=test
1 noslenkwah Oct 22 2020 at 16:15

Sonraki kısım ?sorgu dizesidir. Flask'ın yolları eşleştirirken sorgu dizesini çıkardığından% 99 eminim (bunu belgelerde doğrulayamadım, dolayısıyla% 1). Bu, bir rota eşleştirilirken aşağıdaki URL'lerin aynı olduğu anlamına gelir.

http://192.168.10.88:5000/list/lot/OLDER/NEW?search=test
http://192.168.10.88:5000/list/lot/OLDER/NEW

Yapmaya çalıştığınız şeyi yapmanın başka bir yolu (sanırım) tüm değişkenleriniz için sorgu dizesini kullanmaktır.

@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)