Python устраняет проблемы с использованием Flask

#python #flask #routes

#python #flask #маршруты

Вопрос:

У меня есть следующая функция с возможностью нескольких маршрутов :

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

Все маршруты работают хорошо, кроме последнего. У меня есть URL, который нравится этому :

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

И я не понимаю, почему печать всегда возвращается None .

Есть идеи?

Спасибо

Комментарии:

1. Я думаю, вы должны получить данные поиска request . Не в аргументе функции. Просто импортируйте from flask import request , а затем request.args.get('search') внутри функции

Ответ №1:

Вы можете использовать request или 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'
  

замечания о том, как я request получал значение search : request.args.get('search') .

Вот еще один подход, который я нахожу более простым и чистым:

 @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-адрес выглядит следующим образом:

 http://192.168.10.88:5000/list/lot/parameters?time=OLDERamp;status=NEWamp;search=test
  

Ответ №2:

Часть после ? — это строка запроса. Я на 99% уверен, что Flask удаляет строку запроса при сопоставлении маршрутов (я не смог подтвердить это в документах, следовательно, 1%). Это означает, что следующие URL-адреса идентичны при сопоставлении маршрута.

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

Другой способ сделать то, что (я думаю) вы пытаетесь сделать, это использовать строку запроса для всех ваших переменных.

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