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

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

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

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

Python

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

Q&A

解決済

1回答

12062閲覧

PythonでのURL値の取得

gomakichi

総合スコア17

Flask

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

Python

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

1グッド

1クリップ

投稿2017/11/14 05:44

編集2017/11/16 00:52

質問

PHPでは$_SERVERを使用する↓ことで遷移前の1つ前のページのURLを取得できることを前に学んだのですが、
Pythonにはこういった便利な変数みたいなものは特にないのでしょうか?

<?php echo $_SERVER['HTTP_REFERER']; ?>

色々調べてみたのですが、結果に表示されるものがPHPばかりだったため、もし見逃していたらと思い投稿しました。

やりたいこと

URLからあるサイトの記事にアクセスした際に非ログインだったためログインページに飛ばされるところまではできています
しかし、そのログイン後にTOPページに飛んでしまうため、再度みたかった記事を探さなければなりません。
1つ前のURLw取得しておき、redirectでもともとアクセスしたURLに遷移するようにしたいと思っています。

Pythonの特徴的にあまりこういった1ページ前のuRL取得などの処理は行わないのが一般的なのでしょうか?

追記(11/14 17:00)

request.refferrerというものがあることを知りました。
しかし、ログイン後の各ページの移動の際にはきちんと前のページのURLを取得することができますが、ログイン前の状態でログイン後に遷移可能なページのURLを直接叩いても取得されず、Noneとなってしまいます。

ログイン後に遷移できるページには
@login_requiredを使用しているため、そもそもURLが取れないのでしょうか...?

@login_manager.unauthorized_handler def unauthorized(): app.logger.info('ログイン失敗') print(request.referrer) return redirect(url_for('login', next=request.referrer))

↑のprint(request.referrer)がNoneになります

↓遷移可能なページの処理を記載しているところ

@app.route('/') @login_required def home():

追記(11/15 15:00)

request.urlというものを知りました。

@login_manager.unauthorized_handler def unauthorized(): app.logger.info('ログイン失敗') print(request.url) return redirect(url_for('login', next=request.url))

↑のようにrequest.referrerからrequest.urlに変更したところ前のページのURLを取得することができました。
リダイレクト先のdef loginでも

@app.route('/login', methods=['GET', 'POST']) def login(next=None): print(request.url) ~~~

と記載すると1つ前のURLが取れているように見えます。

その後、1つ前のURLを保持した状態でログインをすると

@app.route('/login', methods=['GET', 'POST']) def login(next=None): print(request.url) ~~~

↑のprint文において、先ほどは取れていたURLではなく
http://~~~~~/loginのようにログインページが1つ前のページ扱いになってしまいます。

何がおかしい(何が起きている)のかわからず困っています...。
詳しい方よろしくお願いいたします。

追記(11/16 10:00)

@app.route('/login', methods=['GET', 'POST']) def login(next=None): print(request.url)

↑を実行すると、

http://[IPアドレス]/contents/1

のように1つ前のURLを取得できます

しかし、その状態でログインを行うと

http://[IPアドレス]/login

のようにloginページが1つ前のページ扱いとなってしまいます...

manzyun👍を押しています

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

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

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

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

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

Lhankor_Mhy

2017/11/15 08:10

「1つ前のURLが取れているように見えます」「ログインページが1つ前のページ扱いになって」とありますが、具体的にはそれぞれどのような出力ですか?
gomakichi

2017/11/16 00:53

追記致しました。確認よろしくお願いいたします。
Lhankor_Mhy

2017/11/16 01:57

request.url はそのページのURLなはずなので、出力がずれているような気がしますが、それで間違いありませんか? あと、nextパラメータはどこに行ってしまったんでしょう?
gomakichi

2017/11/16 02:56

コメントありがとうございます。そうなのですか...。私の確認できている感じですと1つ前のURLが取れているように見られます...。nextについてはprint(next)としたところ、値が取れなかったため一旦どこにも使用していない状況です。
Lhankor_Mhy

2017/11/16 03:14

なんのためにnextパラメータを持たせているのですか? ログイン後リダイレクト先URLだと思っていたのですが、違うのですか?
gomakichi

2017/11/16 05:58

はい、ログイン後のリダイレクト先に使用したいと思っています。しかし、現状ですとそもそもの値が取れていないため、渡す前の話をしておりました。
gomakichi

2017/11/16 05:59

はい、ログイン後のリダイレクト先に使用したいと思っています。しかし、現状ですとそもそもの値が取れていないため、渡す前の話をしておりました。
Lhankor_Mhy

2017/11/16 07:20

nextパラメータを受け取るには、request.args.get('next') だと思いますのでお試しください。ただ、url_for('login', next=request.url) は http://[IPアドレス]/login?next=/contents/1 みたいなURLを生成すると思うのですが、出力されている request.url がそのような値ではないので戸惑っています。
gomakichi

2017/11/22 08:00

返信が遅くなってしまい、すみません...。解決いたしましたので解決方法を記入致しました。ありがとうございました。
guest

回答1

0

自己解決

ログイン前に訪問したページ

@app.route('/') def hogehoge(): if not current_user.is_authenticated: session['hoge_url'] = request.url return current_app.login_manager.unauthorized()

ログイン内

if session['hoge_url']: next_url = session['hoge_url'] session['hoge_url'] = '' return redirect(next_url) return redirect(url_for('hogehoge'))

公式ドキュメントを見たところ@login_requiredではなく

if not current_user.is_authenticated: return current_app.login_manager.unauthorized()

を使うと良いとのことだったのでこちらを使用したらうまくいきました。
ありがとうございました。

投稿2017/11/22 08:05

gomakichi

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問