Flaskを使用してURLから名前付きパラメーターを取得するにはどうすればよいですか?


368

ユーザーがフラスコアプリで実行されているこのURLにアクセスするとき、疑問符の後に指定されたパラメーターをWebサービスで処理できるようにしたいと思います。

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
セキュリティに関するもう1つの小さなヒント:パスワードを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

@multigoodverseは、(URLで)GETを使用してパスワードを送信してはならない理由について、質問の最初のコメントを参照してください。より一般的には、GETリクエスト?ではパラメータの先頭にa が必要なので、を使用することをお勧めしますがapp.route('/?username=<username>&password=<password>')、Flaskは疑問符の後のすべてを読み取りrequest.args、ルートからの変数を解釈しません。HTMLフォームを使用してサンプルルートにアクセスする場合は、それを機能させるために追加のJavaScriptが必要になります。最後に、ルート変数は必須であり、request.argsオプションにすることができます。
デリック

145

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予約語です。使用しないでください;)
Ivan Camilito Ramirez Verdes

88

また、ビュー定義のURLで大括弧<>を使用することもでき、この入力はビュー関数の引数に入ります。

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

1
これが正解だと思うので、フラスコのドキュメントを作成するためです
Nathan Gavenski

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)

パラメータがフォームパラメータとして渡され、URLに表示されないPOSTリクエストの場合、実行しようとしたことは機能します。実際にログインAPIを開発している場合は、GETではなくPOSTリクエストを使用して、データをユーザーに公開することをお勧めします。

投稿リクエストの場合、次のように機能します。

#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

とても簡単です。このプロセスを2つの簡単なステップに分けましょう。

  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)

コードへの参照リンクは次のとおりです。


そのようなユーザー名とパスワードを決して公開しないでください!TSのpalshとDerMikeのコメントを参照してください。
Bas van Ommen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.