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

Когда пользователь получает доступ к этому 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)

Ответ 1

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

from flask import request

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

Ответ 2

Параметры URL доступны в request.args, который является MultiDict, который имеет метод 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: '*'

Ответ 3

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

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

Ответ 4

Если в 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">
  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)

Ответ 5

URL:

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

код:

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

Ответ 6

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

  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