2013-02-18 57 views
1

我想在python燒瓶框架中得到HTTP_REFERER。 我的路線是這樣的:request.environ ['HTTP_REFERER']是無

@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' 

當我第一次寫這個代碼是working.I不直接調用此網址。我打電話localhost:5000/panel,它將我重定向到login方法。所以基本上應該有一個引用者,我錯了嗎?

當我打印的request.environ['HTTP_REFERER']它打印None

我也試圖與

ref = request.referrerNone

爲什麼它可以發生?非常感謝。

回答

0

@ dm03514有正確的想法,但如果你堅持使用environ字典,你應該使用get方法。另外,您如何測試它是否爲None,即,您是使用交互式解釋器來打印該值還是在正文中添加打印語句?

,你會怎麼做這個合理的一個例子:

# 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 
+0

檢查一下我打印裁判變量終端 – saidozcan 2013-02-18 16:48:22

+0

抱歉,但一切都沒有改變 – saidozcan 2013-02-18 16:49:11

+0

你的意思是你添加打印語句和運行服務器。如果您仍然收到上述例外情況,則不能重新啓動服務器。除非對象沒有這樣的方法,get方法不會引發異常EVER。 – 2013-02-18 16:51:13

3

的WERKZEUG請求包裝,該瓶默認情況下使用,這是否對你的工作: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

2

當我第一次寫這段代碼它是工作。我不直接調用 這個URL。我打電話localhost:5000 /面板,它將我重定向到登錄 方法。所以基本上應該有一個引用,我錯了嗎?

這是不正確的。重定向不保證引用者。瀏覽器是否會提供引薦者是特定於瀏覽器的。也許你正在使用一個不同的瀏覽器,在某一點上有這種行爲?你現在的代碼正在儘可能地發揮作用。

Will a 302 redirect maintain the referer string?

+0

好吧,我看到了,謝謝 – saidozcan 2013-02-18 16:55:14

+0

那麼,我該如何設置引用? – saidozcan 2013-02-18 16:56:07

+1

作爲我所鏈接的問題的答案,最確定的方法是不要將其留給瀏覽器。相反,請將引薦來源的網址作爲參數包含在您的網址中。所以,就像'http://example.com/login?referrer = http%3A%2F%2Fexample.com%2Fpanel'。 – 2013-02-18 17:01:02