是否可以在 Flask 中阻止来自站点本身外部引用的特定路由(例如 /data
)?
最佳答案
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)
我确信操作系统和设备中的不同浏览器会通过引用网址做一些稍微奇怪的事情,因此值得了解一下它们的特性。也许最好在他们访问您的主页/入口路由时设置 session 值,然后使用 before_request
检查 session 值是否设置,几乎就像自动登录一样。
因此,如果您想保护除 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
。现在,每当用户访问该网站时,如果他们是新用户,他们都会被重定向回主页,或者如果 session 仍然处于事件状态,他们将能够看到所有内容。有点像酒店/咖啡馆的无线热点。
关于routes - 在 Flask 中阻止特定路由上的引荐来源网址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26557310/