request.environ['HTTP_REFERER'] 为空
我想在Python的Flask框架中获取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'
我第一次写这个代码的时候是可以工作的。我并不是直接访问这个网址,而是访问localhost:5000/panel
,然后它把我重定向到login
方法。所以理论上应该有一个来源地址,我是不是理解错了?
当我打印request.environ['HTTP_REFERER']
时,它显示None
我也试过用
ref = request.referrer
,但它也是None
为什么会这样呢?非常感谢。
4 个回答
1
我发现要让 request.referrer 不为 None,唯一的方法就是通过 <a href="/something"></a>
这个链接来加载页面。其他的方式,比如重定向或者普通的 HTTP 请求,都不会带上 referrer 这个属性。
4
我第一次写这个代码的时候是能正常工作的。我并不是直接调用这个网址,而是调用localhost:5000/panel,然后它会把我重定向到登录方法。所以基本上应该有一个来源地址,我是不是错了?
这个说法不太对。重定向并不一定会有来源地址。浏览器是否会提供来源地址是跟浏览器有关的。也许你之前用过的某个浏览器在某个时候有这种行为?你现在的代码已经尽可能地正常工作了。
可以参考这个链接:302重定向会保留来源地址吗?
4
Flask 默认使用的 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