3

HTTP_REFERER私はpythonフラスコフレームワークに入りたいです。私のルートはこれです:

@app.route('/login')

def login():

    if authenticateForPanel():
        return redirect(url_for("panel"))
    else:               
        ref = request.environ['HTTP_REFERER']

        return render_template('login.html',blogOptions = g.blogOptions,ref=ref)

これを実行するKeyError: 'HTTP_REFERER'と、トレースバックが表示されます:

Traceback (most recent call last):
  File "/Users/ozcan/flask/flask/app.py", line 1823, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/ozcan/flask/flask/app.py", line 1811, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/Users/ozcan/flask/flask/app.py", line 1809, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/ozcan/flask/flask/app.py", line 1482, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/ozcan/flask/flask/app.py", line 1480, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/ozcan/flask/flask/app.py", line 1466, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/ozcan/Documents/python/app.py", line 318, in login
    ref = request.environ['HTTP_REFERER']
KeyError: 'HTTP_REFERER'

私が最初にこのコードを書いたとき、それは機能していました.私はこのURLを直接呼び出しませlocalhost:5000/panelん.私が呼び出すと、メソッドにリダイレクトされloginます.

印刷するrequest.environ['HTTP_REFERER']と印刷されますNone

私も試してみました

ref = request.referrerしかし、それはNone

なぜそれが起こることができますか?どうもありがとう。

4

4 に答える 4

4

このコードを最初に書いたときは機能していました。このURLを直接呼び出さないでください。localhost:5000 / panelを呼び出すと、ログインメソッドにリダイレクトされます。基本的にリファラーが必要です。間違っていますか?

これは正しくありません。リダイレクトはリファラーを保証するものではありません。ブラウザがリファラーを提供するかどうかは、ブラウザによって異なります。おそらく、ある時点でこの動作をした別のブラウザを使用していましたか?現在使用しているコードは、期待どおりに機能しています。

302リダイレクトはリファラー文字列を維持しますか?を参照してください。

于 2013-02-18T16:53:11.523 に答える
4

フラスコがデフォルトで使用するwerkzeugRequestラッパーは、これを自動的に機能させます:request.referrer

from flask import Flask, request
import unittest

app = Flask(__name__)
@app.route('/')
def index():
    return unicode(request.referrer)

class Test(unittest.TestCase):

    def test(self):
        c = app.test_client()
        resp = c.get('/', headers={'Referer': '/somethingelse'})
        self.assertEqual('/somethingelse', resp.data)

if __name__ == '__main__':
    unittest.main()

ただし、より一般的なケースでは、キーが存在しない場合にデフォルトを指定する辞書キーの値を取得するには、dict.getを使用します。

于 2013-02-18T16:51:31.190 に答える
0

@ dm03514は正しい考えを持っていますが、environ辞書の使用に固執している場合は、getメソッドを使用する必要があります. また、None であることをどのようにテストしていますか。つまり、対話型インタープリターを使用して値を出力していますか、それとも本体に print ステートメントを追加していますか?

これを合理的に行う方法の例:

# snip
else:
    ref = request.environ.get('HTTP_REFERER')
    # You can specify a default return value other than None like so:
    # ref = request.environ.get('HTTP_REFERER', '/')
# snip
于 2013-02-18T16:47:01.733 に答える