我想在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'
当我第一次编写此代码时,它正在工作。我不直接调用此url.I调用localhost:5000/panel
并将其重定向到login
方法。所以基本上应该有一个引用者,我我错了?
当我打印request.environ['HTTP_REFERER']
时,它会打印None
我也试过
ref = request.referrer
但它是None
为什么会发生?非常感谢。
答案 0 :(得分:4)
当我第一次写这段代码时,它正在工作。我不直接打电话 这个url.I调用localhost:5000 / panel,它将我重定向到登录 所以基本上应该有一个推荐人,我错了吗?
这不正确。重定向不保证引荐来源。浏览器是否提供引荐来源是特定于浏览器的。也许您使用的是另一种具有此行为的浏览器?您现在拥有的代码尽可能地正常运行。
答案 1 :(得分: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 :(得分:1)
我可以使request.referrer不为None的唯一方法是通过<a href="/something"></a>
加载页面。重定向和发出常规的旧HTTP请求不包含Referrer属性。
答案 3 :(得分: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