質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

13254閲覧

Flaskのrequest.argsの具体的な内容・挙動がわからない

baboo

総合スコア8

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/03/15 17:27

編集2021/03/15 17:50

#課題
Python、Flaskの学習を初めて数ヶ月の者です。下記の書籍をベースにWebアプリ開発の勉強をしております。

現在flask_loginを利用したログイン機能の実装をしているのですが、下記のようなコードが出てきた際にrequest.args.get('next')の部分が具体的に何を取得しているのかいまいち分かっておりません。

request.argsはwerkzeug.datastructures.ImmutableMultiDictのインスタンスであるという記述や、.getメソッドで辞書型のオブジェクトへアクセスし、キーがnextのデータを取得しているのだろう、とは思うのですが、
そもそもrequest.args自体が具体的にどのようなデータが格納されており、キーがnextのデータはどのタイミングで作成?されたのかなどが分かっておりません。

拙いながら下記公式ドキュメントを読んだもののピンとこず、、、
https://flask.palletsprojects.com/en/1.1.x/api/#flask.Request.args

お知恵拝借できますと幸いです。

#ソースコード

@auth.route('/login', methods=['GET', 'POST']) def login(): form = LoginForm() if form.validate_on_submit(): user = User.query.filter_by(email = form.email.data).first() if user is not None and user.verify_password(form.password.data): login_user(user, form.remember_me.data) next = request.args.get('next') if next is None or not next.startswith('/'): next = url_for('main.index') return redirect(next) flash('Invalid username or password.') return render_template('auth/login.html', form = form)

※UserはUserMixinクラスを継承したクラスです。
なお、auth/login.htmlは下記になります。

<!DOCTYPE html> <html> <head> </head> <body> <div> <form method= "POST" > {{ form.hidden_tag() }} {{ form.email.label }} {{ form.email(class="text-field-class") }} {{ form.password.label }} {{ form.password(class="text-field-class") }} {{ form.submit() }} </form> </div> </body> </html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/03/15 17:30

auth/login.html に書いてあるのでは。
baboo

2021/03/15 17:52

ご質問ありがとうございます! 自分もauth/login.html側で何かを送信していて、そこを取得しているのかなぁと思っていたのですが、 フォーム以外特に何も送信しておらず、、、。 auth/login.htmlの内容を質問に追加いたしました。ご指摘ありがとうございます!
hoshi-takanori

2021/03/15 18:14

そっか、email や password は post パラメータだけど、next は url の一部 (/login?next=〜) みたいですね。で、その url は flask_login.login_url で作られて、その引数に next_url で指定できるってことだと思います。 https://flask-login.readthedocs.io/en/latest/#utilities
baboo

2021/03/15 18:35

なるほど!flask_login.login_urlを使用してログイン後の次のリダイレクト先が指定されていた場合にはそのURLへ、そうでない場合はmain.indexへリダイレクトする、という処理だったんですね。。。! とてもよくわかりました!本当にありがとうございます! よろしければベストアンサーにさせていただきたいので、回答の方に簡単にご記載いただけますと幸いです、、、!
guest

回答2

0

別の回答やコメントで既に解決済みかもしれませんが、flask.request.argsはURLのパラメータ(query stringと呼ばれたりします)を格納します。

ちなみにflask.request.formはPOSTメソッドで送信されたformデータを格納します。質問にあるコードの「LoginForm」の内容はわかりませんが、恐らくflask.request.formからデータを取得しているのかと思います。

参考までに、Pythonのインタプリタ上でテスト用にflask.request.argsflask.request.formの内容を設定、表示する例は以下のようになります:

python

1>>> import flask 2>>> 3>>> # Flaskアプリケーションのオブジェクト作成 4>>> app = flask.Flask(__name__) 5>>> 6>>> # URLに含めるquery_string用データ 7>>> arg_dict = { "a1": "v-a1", "a2": "v-a2" } 8>>> 9>>> # POSTで送るデータ(formデータ) 10>>> form_dict = { "f1": "v-f1", "f2": "v-f2" } 11>>> 12>>> # HTTPリクエストを受信した状態を模倣する(flask.requestで実際の 13>>> # リクエストがあるかのように処理できるようにする) 14>>> ctx = app.test_request_context( 15... "/hello", 16... method="POST", 17... query_string=arg_dict, 18... data=form_dict 19... ) 20>>> ctx.push() 21>>> 22>>> # リクエストの内容を表示 23>>> print(flask.request) 24<Request 'http://localhost/hello?a1=v-a1&a2=v-a2' [POST]> 25>>> print(flask.request.args) 26ImmutableMultiDict([('a1', 'v-a1'), ('a2', 'v-a2')]) 27>>> print(flask.request.form) 28ImmutableMultiDict([('f1', 'v-f1'), ('f2', 'v-f2')]) 29>>> 30>>> # HTTPリクエストを受信した状態の模倣を終わらせる 31>>> ctx.pop() 32>>>

投稿2021/03/16 02:00

msiz07

総合スコア172

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

baboo

2021/03/24 02:23

こちらご回答いただきありがとうございます!おっしゃるように既に解決しておりましたため、その方をBAに選択させていただきましたが、非常に分かりやすく、さらに理解が深まる内容でした。誠にありがとうございます!
guest

0

ベストアンサー

request.args は URL パラメータ (/login?next=〜 みたいなやつ) を取得するもののようですね。
で、その URL は flask_login.login_url で作られて、その next_url 引数で指定できるってことだと思います。

投稿2021/03/15 19:35

hoshi-takanori

総合スコア7895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

baboo

2021/03/24 02:22

遅くなってしまいすみません!ご回答いただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問