質問
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つ前のページ扱いとなってしまいます...
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
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()
を使うと良いとのことだったのでこちらを使用したらうまくいきました。
ありがとうございました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.18%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
Lhankor_Mhy
2017/11/15 17:10
「1つ前のURLが取れているように見えます」「ログインページが1つ前のページ扱いになって」とありますが、具体的にはそれぞれどのような出力ですか?
gomakichi
2017/11/16 09:53
追記致しました。確認よろしくお願いいたします。
Lhankor_Mhy
2017/11/16 10:57
request.url はそのページのURLなはずなので、出力がずれているような気がしますが、それで間違いありませんか? あと、nextパラメータはどこに行ってしまったんでしょう?
gomakichi
2017/11/16 11:56
コメントありがとうございます。そうなのですか...。私の確認できている感じですと1つ前のURLが取れているように見られます...。nextについてはprint(next)としたところ、値が取れなかったため一旦どこにも使用していない状況です。
Lhankor_Mhy
2017/11/16 12:14
なんのためにnextパラメータを持たせているのですか? ログイン後リダイレクト先URLだと思っていたのですが、違うのですか?
gomakichi
2017/11/16 14:58
はい、ログイン後のリダイレクト先に使用したいと思っています。しかし、現状ですとそもそもの値が取れていないため、渡す前の話をしておりました。
gomakichi
2017/11/16 14:59
はい、ログイン後のリダイレクト先に使用したいと思っています。しかし、現状ですとそもそもの値が取れていないため、渡す前の話をしておりました。
Lhankor_Mhy
2017/11/16 16: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 17:00
返信が遅くなってしまい、すみません...。解決いたしましたので解決方法を記入致しました。ありがとうございました。