是否可以在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)


我敢肯定,操作系统和设备中的不同浏览器会对引荐来源网址产生一些奇怪的影响,因此值得一看它们的特质。也许最好是在他们访问您的首页/进入路线时设置会话值,然后使用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。现在,每当用户访问该站点时,如果他们是新用户,他们都将被重定向回首页,或者如果该会话仍处于活动状态,则他们将能够看到所有内容。有点像酒店/咖啡馆中的无线热点。

09-29 23:16