Запрос аргументов не форматируется так, как я хотел бы в маршруте приложения

#python #flask #python-requests #args

#python #flask #python-запросы #аргументы

Вопрос:

Я пытаюсь сгенерировать фильтр для SQL alchemy DB. Я могу правильно выполнить запрос и получить желаемый результат, однако мне нужно правильно получать запросы и соответствующим образом их форматировать.

Я нажимаю URL, как:

 http://localhost:3000/books?filter=price,eq,37amp;filter=code,eq,50
 

Когда я получаю аргументы, они выглядят как:

 ImmutableMultiDict([('filter', 'price,eq,37'), ('filter', 'code,eq,50')])
 

Но чего я действительно хочу, так это:

 {"filter": ["price,eq,37", "code,eq,50"]}
 

Получение запроса, подобного:

 @app.route('/books', methods=['GET'])
def books() -> str:
  args = request.args
  print(args)
 

Любая помощь будет с благодарностью.

Ответ №1:

Вы можете передать flat=False параметр request.args.to_dict() методу для получения нескольких значений запроса для одного ключа.

Пример:

 @app.route('/')
def index():
    query_params = request.args.to_dict(flat=False)
    # print(query_params)
    return query_params
 

Пожалуйста, поддержите решение, если оно окажется полезным.

Ответ №2:

Метод lists() возвращает итерацию (key, values) :

 dict(request.args.lists()) # returns {"filter": ["price,eq,37", "code,eq,50"]}
 

Метод getlist() возвращает все значения ключа:

 request.args.getlist('filter') # returns ["price,eq,37", "code,eq,50"]
 

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

1. Это возвращает — ImmutableMultiDict([(‘filter’, ‘defense, eq,37’), (‘filter’, ‘attack, eq,50’)]). Я бы хотел {«filter»: [«price, eq,37», «code, eq,50»]}