2013-02-18 61 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