【发布时间】:2014-10-24 22:36:30
【问题描述】:
是否可以在 Flask 中阻止来自站点本身外部的引用者的特定路由(例如 /data)?
【问题讨论】:
标签: routes flask http-referer
是否可以在 Flask 中阻止来自站点本身外部的引用者的特定路由(例如 /data)?
【问题讨论】:
标签: routes flask http-referer
request.referrer 包含请求的引用者,因此您可以在此基础上应用一些逻辑。
from flask import Flask, request, redirect, url_for, render_template_string
app = Flask(__name__)
@app.route('/')
def home():
return render_template_string('''
<a href="{{ url_for('data') }}">Correctly Referred</a>
''')
@app.route('/data')
def data():
print request.referrer
if request.referrer != 'http://127.0.0.1:5000/':
return abort(403) # Forbidden
# or maybe: return redirect(url_for('home'))
return 'Woo!'
if __name__ == '__main__':
app.run(debug=True)
我敢肯定,操作系统和设备中的不同浏览器会对引荐来源做出一些奇怪的事情,因此值得了解一下它们的特性。也许在他们访问您的主页/入口路径时设置一个会话值会更好,然后使用before_request 检查会话值是否设置,几乎就像自动登录一样。
所以如果你想保护你的所有页面,除了你的home 路由——你可以这样:
@app.before_request
def check_session():
print request.endpoint
if not session.get("legit") and request.endpoint is not 'home':
return redirect(url_for('home'))
然后在您的回家路线上,只需添加session["legit"] = True。现在,每当用户访问该站点时,如果他们是新用户,或者会话仍处于活动状态,他们将被重定向回主页,他们将能够看到所有内容。有点像酒店/咖啡厅的无线热点。
【讨论】:
before_request(目前仍在使用 JSON 数据而不是真正的数据库),所以我看不出它如何改善这种情况。但是,我可以在要阻止的路线上使用装饰器,但我不确定这就是您使用 before_request 的意思
before_request 的示例以保护除home 之外的所有内容