Як я можу отримати названі параметри з URL-адреси за допомогою колби?


366

Коли користувач отримує доступ до цієї 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

Відповіді:


591

Використовуйте 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 повинен мати ?на початку параметрів, так що ви хочете app.route('/?username=<username>&password=<password>'), але Flask прочитає все після знака питання в request.argsі не буде інтерпретувати змінні маршруту. Якщо ви хочете дістатися до вашого прикладу маршруту за допомогою форми HTML, вам знадобиться купа додаткового JavaScript, щоб він працював. Нарешті, змінні маршруту є обов'язковими, request.argsможуть бути необов'язковими.
dericke

144

Параметри URL доступні в request.args, що є ImmutableMultiDict, який має getметод, з необов'язковими параметрами для значення за замовчуванням ( default) та типу ( 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є застереженим словом, не слід вживати;)
Іван Каміліто Рамірес Вердес

88

Ви також можете використовувати дужки <> у URL-адресі визначення перегляду, і цей вхід увійде в аргументи функції перегляду

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

1
Я думаю, що це має бути відповіддю, оскільки саме це стосується документації de flask
Натан Гавенскі,

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.