Как получить доступ к строке запроса в маршрутах Flask?

avatar
Tampa
2 августа 2012 в 09:04
458031
12
538

Как получить доступ к параметрам запроса или строке запроса в маршрутах Flask? Это не очевидно из документации Flask.

Пример маршрута /data ниже иллюстрирует контекст, в котором я хотел бы получить доступ к этим данным. Если кто-то запрашивает что-то вроде example.com/data?abc=123, я хотел бы получить доступ к строке ?abc=123 или получить значение таких параметров, как abc.

@app.route("/data")
def data():
    # query_string = ???
    return render_template("data.html")
Источник

Ответы (12)

avatar
Kracekumar
2 августа 2012 в 09:14
997
from flask import request

@app.route('/data')
def data():
    # here we want to get the value of user (i.e. ?user=some-value)
    user = request.args.get('user')
Lyndsy Simon
2 августа 2012 в 16:32
81

В этом примере возвращается это значение параметра «пользователь», переданное в строке запроса, а не сама строка запроса. «Строка запроса» означает все, что находится после вопросительного знака и перед знаком фунта, если он присутствует.

Necronet
19 января 2013 в 19:52
65

все еще полезный ответ, считайте, что он связан с вопросом. Так действительно и +1

Andy Hayden
23 октября 2016 в 07:35
1

Будет ли это вызывать исключение, если пользователя нет? (Думаю, нет, если args - это просто диктат.)

JPEG_
23 октября 2016 в 08:46
9

Нет - как с dict и .get, вы просто получите None.

Michael Scheper
13 января 2017 в 23:45
9

@LyndsySimon: Хорошо замечено. Но поскольку этот ответ правильно отвечает на вопрос, на который ссылаются мои поисковые запросы Google ('flask get request parameter'), я все равно голосую за него. Я тоже педант, но списываю это на сетевую мистику. 😉

Lyndsy Simon
27 января 2017 в 15:56
8

Никаких аргументов с моей стороны! Мои комментарии по этому вопросу были постоянным источником ТАКИХ очков и общей кармы. :) Удачного взлома!

geotheory
30 января 2018 в 10:02
1

@Necronet бесполезно, если, как OP, вам нужна фактическая строка.

Rishabh Sahrawat
15 января 2020 в 08:13
0

Я использую ваше предложение, но не могу ввести значение с пробелом, например software solutions. Как этого добиться? Спасибо.

Kracekumar
16 января 2020 в 09:32
0

Это может произойти, если строка запроса не закодирована по URL-адресу. Посмотрите в журнале сервера два случая. Закодированный URL будет иметь вид "GET / data? User = krace% 20kumar HTTP / 1.1" 200 "Незакодированный URL-адрес будет" GET / data? User = krace kumar HTTP / 1.1 "HTTPStatus.BAD_REQUEST -

Marvin
19 января 2020 в 22:34
1

@Kracekumar было бы полезно отредактировать свой часто цитируемый ответ, включив в него информацию с coderhelper.com/a/55252011/500902 ниже. Возможно, это правда, что этот ответ более полезен для большего числа людей, но стоит отметить другой ответ.

avatar
Mark Kortink
17 ноября 2021 в 02:22
1

Часто мы просто хотим преобразовать всю строку запроса в соответствующую структуру данных Python и взять ее оттуда. Подходящей структурой является мультисловарь, потому что ключевые слова могут повторяться, например, нам нужно обработать A=123&A=456&B=789. Мультисловарь — это список из 2-х кортежей, где каждый 2-кортеж содержит ключ в качестве первого элемента и список значений в качестве второго, поэтому приведенное выше относится к [('A',['123','456']),('B',['789'])]. Все это достигается за счет

qstr = request.args.lists() # A generator for the multi-dict
qstr = list(qstr) # To get the actual multi-dict

Если все, что вам нужно, это словарь, в котором используется первое вхождение повторяющегося ключевого слова, вы можете просто перейти

qstr = request.args.to_dict()
avatar
might.be.simon
23 сентября 2021 в 20:55
1

Я предпочитаю

user = request.args['user'] if 'user' in request.args else 'guest'

более

user = request.args.get('user')

таким образом вы можете проверить, что URL-адрес действительно содержит строку запроса сначала

avatar
Olugbenga Aladeusi
14 апреля 2021 в 19:19
1

У меня сработала реализация, представленная ниже.

from flask import request
def getVerificationStatus():
try:
    requestId=int(request.args.get('requestId'))
    print(requestId)
    status= verificationStepRepository.getVerificationStatus(requestId)
    return tb.responsify(200, "success", status)
except Exception as e:
    return errorHandler.dispatchInternalServerError(str(e))
avatar
23r0c001
25 апреля 2020 в 03:49
7

Каждая форма строки запроса, извлекаемая из объекта запроса flask, как описано в Веб-разработка O'Reilly Flask:

Из O'Reilly Flask Web Development, и, как было заявлено ранее Мананом Гухари, сначала вам нужно импортировать запрос:

from flask import request

request - это объект, представленный Flask как контекстная переменная с именем (как вы уже догадались) request. Как следует из названия, он содержит всю информацию, которую клиент включил в HTTP-запрос. Этот объект имеет множество атрибутов и методов, которые вы можете извлекать и вызывать соответственно.

У вас есть несколько атрибутов request, которые содержат строку запроса, из которой можно выбрать. Здесь я перечислю каждый атрибут, который каким-либо образом содержит строку запроса, а также описание этого атрибута из книги О'Рейли.

Сначала идет args, который представляет собой «словарь со всеми аргументами, переданными в строке запроса URL-адреса». Итак, если вы хотите, чтобы строка запроса была проанализирована в словаре, вы должны сделать что-то вроде этого:

from flask import request

@app.route('/'):
    queryStringDict = request.args

(Как указывали другие, вы также можете использовать .get('<arg_name>') для получения определенного значения из словаря)

Затем есть атрибут form, который не содержит строку запроса, но который включен в часть другого атрибута, который включает строку запроса, которая I перечислю на мгновение. Во-первых, form - это «Словарь со всеми полями формы, отправленными с запросом». Я говорю это, чтобы сказать следующее: есть еще один атрибут словаря, доступный в объекте запроса фляги, который называется values. values - это «Словарь, который объединяет значения в form и args». Это будет выглядеть примерно так:

from flask import request

@app.route('/'):
    formFieldsAndQueryStringDict = request.values

(снова используйте .get('<arg_name>'), чтобы получить конкретный элемент из словаря)

Другой вариант - query_string, который представляет собой «Часть строки запроса URL-адреса в виде необработанного двоичного значения». Пример этого:

from flask import request

@app.route('/'):
    queryStringRaw = request.query_string

Затем в качестве дополнительного бонуса существует full_path, который представляет собой «части пути и строки запроса URL-адреса». По запросу:

from flask import request

@app.route('/'):
    pathWithQueryString = request.full_path

И, наконец, url, «Полный URL-адрес, запрошенный клиентом» (который включает строку запроса):

from flask import request

@app.route('/'):
    pathWithQueryString = request.url

Удачного взлома :)

avatar
RAJAHMAD MULANI
15 февраля 2020 в 18:35
1

Если запрос GET и мы передали некоторые параметры запроса, то

fro`enter code here`m flask import request
@app.route('/')
@app.route('/data')
def data():
   if request.method == 'GET':
      # Get the parameters by key
      arg1 = request.args.get('arg1')
      arg2 = request.args.get('arg2')
      # Generate the query string
      query_string="?arg1={0}&arg2={1}".format(arg1, arg2)
      return render_template("data.html", query_string=query_string)
avatar
Sankar guru
25 апреля 2019 в 11:35
6

Попробуйте это для строки запроса:

from flask import Flask, request

app = Flask(__name__)

@app.route('/parameters', methods=['GET'])
def query_strings():

    args1 = request.args['args1']
    args2 = request.args['args2']
    args3 = request.args['args3']

    return '''<h1>The Query String are...{}:{}:{}</h1>''' .format(args1,args2,args3)


if __name__ == '__main__':

    app.run(debug=True)

Вывод: enter image description here

avatar
Michael Ribbons
20 марта 2019 в 00:46
18

Я пришел сюда в поисках строки запроса, а не того, как получить значения из строки запроса.

request.query_string возвращает параметры URL в виде необработанной байтовой строки (ссылка 1).

Пример использования request.query_string:

from flask import Flask, request

app = Flask(__name__)

@app.route('/data', methods=['GET'])
def get_query_string():
    return request.query_string

if __name__ == '__main__':
    app.run(debug=True)

Вывод:

query parameters in Flask route

Ссылки:

  1. Официальная документация API по query_string
avatar
Manan Gouhari
10 января 2019 в 08:43
0

Это можно сделать с помощью request.args.get(). Например, если в строке запроса есть поле date, к нему можно получить доступ, используя

date = request.args.get('date')

Не забудьте добавить «request» в список импорта из колбы, т.е.

from flask import request
avatar
Pralhad Narsinh Sonar
29 мая 2015 в 05:26
16

Мы можем сделать это с помощью request.query_string.

Пример:

Давайте рассмотрим view.py

from my_script import get_url_params

@app.route('/web_url/', methods=('get', 'post'))
def get_url_params_index():
    return Response(get_url_params())

Вы также можете сделать его более модульным, используя Flask Blueprints - https://flask.palletsprojects.com/en/1.1.x/blueprints/

Допустим, имя передается как часть строки запроса. / web_url /? first_name = john

## here is my_script.py

## import required flask packages
from flask import request
def get_url_params():
    ## you might further need to format the URL params through escape.    
    firstName = request.args.get('first_name') 
    return firstName
    

Как видите, это всего лишь небольшой пример - вы можете получить несколько значений + отформатировать их и использовать или передать в файл шаблона.

avatar
Simon Sapin
3 августа 2012 в 09:08
15

Werkzeug / Flask уже все проанализировал за вас. Нет необходимости снова выполнять ту же работу с urlparse:

from flask import request

@app.route('/')
@app.route('/data')
def data():
    query_string = request.query_string  ## There is it
    return render_template("data.html")

Полная документация по объектам запроса и ответа находится в Werkzeug: http://werkzeug.pocoo.org/docs/wrappers/

avatar
Lyndsy Simon
2 августа 2012 в 16:29
295

Полный URL-адрес доступен как request.url, а строка запроса доступна как request.query_string.decode().

Вот пример:

from flask import request

@app.route('/adhoc_test/')
def adhoc_test():

    return request.query_string

Чтобы получить доступ к отдельному известному параметру, переданному в строке запроса, вы можете использовать request.args.get('param'). Насколько я знаю, это «правильный» способ сделать это.

ETA: Прежде чем идти дальше, вы должны спросить себя, зачем вам нужна строка запроса. Мне никогда не приходилось вытаскивать необработанную строку - Flask имеет механизмы для доступа к ней абстрактным способом. Вам следует использовать их, если у вас нет веских причин не делать этого.

Hasintha Abeykoon
6 октября 2021 в 15:29
0

Я не уверен, почему в ответе указано ETA: Before you go further, you should ask yourself why you want the query string, потому что, если ваш API имеет механизм аутентификации типа OAuth, я думаю, вам нужно будет прочитать параметры запроса (не совсем уверен, прав ли я это о Flask, так как я начал изучать Flask сегодня !)