Как я могу получить названные параметры из URL, используя Flask?


369

Когда пользователь получает доступ к этому URL-адресу, запущенному в моем приложении фляги, я хочу, чтобы веб-служба могла обрабатывать параметры, указанные после знака вопроса:

http://10.1.1.1:5000/login?username=alex&password=pw1

#I just want to be able to manipulate the parameters
@app.route('/login', methods=['GET', 'POST'])
def login():
    username = request.form['username']
    print(username)
    password = request.form['password']
    print(password)

89
Небольшая подсказка для безопасности: не включайте пароли в запросы GET. security.stackexchange.com/questions/147188/...
palsch

6
Еще один небольшой совет по безопасности: не отправляйте пароли на конечные точки HTTP (только когда-либо HTTPS)
DerMike

Ответы:


593

Используйте request.argsдля получения проанализированного содержимого строки запроса:

from flask import request

@app.route(...)
def login():
    username = request.args.get('username')
    password = request.args.get('password')

1
Как это сравнить с использованием параметров в app.route('/username=<username>&password=<password>')? Таким образом, вы вообще не пишете строки request.args.get.
мультигудверс

@multigoodverse см. первый комментарий на вопрос, почему вы не должны посылать пароль через GET (в URL). В более общем случае, запрос GET должен иметь a ?в начале параметров, так что вы захотите app.route('/?username=<username>&password=<password>'), но Flask будет читать все после вопросительного знака request.argsи не будет интерпретировать переменные из маршрута. Если вы хотите добраться до своего примера маршрута с помощью HTML-формы, вам понадобится куча дополнительных JavaScript, чтобы он работал. Наконец, переменные маршрута являются обязательными, request.argsмогут быть необязательными.
dericke

146

Доступны параметры URL request.argsв ImmutableMultiDict , у которого есть getметод, с необязательными параметрами для значений по умолчанию ( default) и type ( type), которые могут вызываться для преобразования входного значения в требуемый формат. (См. Документацию метода для более подробной информации.)

from flask import request

@app.route('/my-route')
def my_route():
  page = request.args.get('page', default = 1, type = int)
  filter = request.args.get('filter', default = '*', type = str)

Примеры с кодом выше:

/my-route?page=34               -> page: 34  filter: '*'
/my-route                       -> page:  1  filter: '*'
/my-route?page=10&filter=test   -> page: 10  filter: 'test'
/my-route?page=10&filter=10     -> page: 10  filter: '10'
/my-route?page=*&filter=*       -> page:  1  filter: '*'

2
@ qqbenq. Это выдающийся ответ! Я не знаю, стоит ли мне использовать колбу для этой функции или вашего кода, но это именно то, что я искал, чтобы проанализировать мой ввод URL.
frakman1

2
filterэто зарезервированное слово, не следует использовать;)
Иван Камилито Рамирес Вердес

89

Вы также можете использовать скобки <> в URL определения представления, и эти входные данные войдут в аргументы функции представления

@app.route('/<name>')
def my_view_func(name):
    return name

1
Я думаю, что это должен быть ответ, так как это то, для чего идет документация на колбу
Натан Гавенски

31

Если в URL передан один аргумент, вы можете сделать это следующим образом

from flask import request
#url
http://10.1.1.1:5000/login/alex

from flask import request
@app.route('/login/<username>', methods=['GET'])
def login(username):
    print(username)

Если у вас есть несколько параметров:

#url
http://10.1.1.1:5000/login?username=alex&password=pw1

from flask import request
@app.route('/login', methods=['GET'])
    def login():
        username = request.args.get('username')
        print(username)
        password= request.args.get('password')
        print(password)

То, что вы пытались сделать, работает в случае запросов POST, когда параметры передаются как параметры формы и не отображаются в URL. В случае, если вы на самом деле разрабатываете API входа в систему, рекомендуется использовать запрос POST, а не GET и предоставить данные пользователю.

В случае почтового запроса это будет работать следующим образом:

#url
http://10.1.1.1:5000/login

HTML-фрагмент:

<form action="http://10.1.1.1:5000/login" method="POST">
  Username : <input type="text" name="username"><br>
  Password : <input type="password" name="password"><br>
  <input type="submit" value="submit">
</form>

Маршрут:

from flask import request
@app.route('/login', methods=['POST'])
    def login():
        username = request.form.get('username')
        print(username)
        password= request.form.get('password')
        print(password)

11

URL:

http://0.0.0.0:5000/user/name/

код:

@app.route('/user/<string:name>/', methods=['GET', 'POST'])
def user_view(name):
    print(name)

(Изменить: удаленные пробелы в строке формата)


-1

Это действительно просто. Позвольте мне разделить этот процесс на два простых шага.

  1. В HTML-шаблоне вы объявите имя тега для имени пользователя и пароля как

    <form method="POST">
    <input type="text" name="user_name"></input>
    <input type="text" name="password"></input>
    </form>
  2. Затем измените ваш код как:

    from flask import request
    
    @app.route('/my-route', methods=['POST']) #you should always parse username and 
    # password in a POST method not GET
    def my_route():
      username = request.form.get("user_name")
      print(username)
      password = request.form.get("password")
      print(password)
    #now manipulate the username and password variables as you wish
    #Tip: define another method instead of methods=['GET','POST'], if you want to  
    # render the same template with a GET request too

-2

Используйте request.args.get(param), например:

http://10.1.1.1:5000/login?username=alex&password=pw1
@app.route('/login', methods=['GET', 'POST'])
def login():
    username = request.args.get('username')
    print(username)
    password = request.args.get('password')
    print(password)

Вот ссылка на код ссылки.


Никогда не выставляйте имя пользователя и пароль, как это! Смотрите комментарии Palsh и DerMike на TS.
Бас ван Оммен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.