3

我想进入HTTP_REFERERpython 烧瓶框架。我的路线是这样的:

@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

默认情况下,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

于 2013-02-18T16:51:31.190 回答
4

当我第一次编写这段代码时它正在工作。我不直接调用这个 url。我调用 localhost:5000/panel 并将我重定向到登录方法。所以基本上应该有一个引用者,我错了吗?

这是不正确的。重定向不保证推荐人。浏览器是否会提供引荐来源网址是特定于浏览器的。也许您使用的其他浏览器曾一度出现这种行为?您现在拥有的代码可以达到预期效果。

请参阅302 重定向是否会维护引用字符串?

于 2013-02-18T16:53:11.523 回答
1

我可以让 request.referrer 不是 None 的唯一方法是通过<a href="/something"></a>. 重定向和发出常规的旧 HTTP 请求不包含引用者属性。

于 2019-01-04T20:33:44.973 回答
0

@dm03514 有正确的想法,但是如果您坚持使用environ字典,则应该使用该get方法。此外,您如何测试它是否为无,即,您是使用交互式解释器打印值还是在正文中添加打印语句?

您将如何合理地执行此操作的示例:

# 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 回答