Python 限制登录用户对静态文件的访问
我想限制文件对登录用户可用,但否则返回403错误或类似错误。例如,用户只有在登录后才能查看/下载Python 限制登录用户对静态文件的访问,python,nginx,flask,Python,Nginx,Flask,我想限制文件对登录用户可用,但否则返回403错误或类似错误。例如,用户只有在登录后才能查看/下载/static/data/example.csv 如果文件未登录,我知道如何使用Flask Login控制文件的实际显示,但如果他们直接在浏览器中访问链接,我知道如何阻止对文件的访问。Flask提供静态文件。在生产过程中,您通常会“短路”此路径,以便Nginx在请求到达应用程序之前提供文件。与其添加这个“短路”,不如省去它,让Flask处理请求。用Flask Login的Login\u require
/static/data/example.csv
如果文件未登录,我知道如何使用Flask Login控制文件的实际显示,但如果他们直接在浏览器中访问链接,我知道如何阻止对文件的访问。Flask提供静态文件。在生产过程中,您通常会“短路”此路径,以便Nginx在请求到达应用程序之前提供文件。与其添加这个“短路”,不如省去它,让Flask处理请求。用Flask Login的Login\u required
包装的静态路由覆盖静态路由
from flask_login import login_required
app.view_functions['static'] = login_required(app.send_static_file)
但这通常是过分的,因为您希望不管发生什么情况都能提供真正的静态文件,这样页面才适合未登录的用户(否则CSS甚至不会被发送到登录页面)。相反,“短路”Nginx要提供的静态文件夹,并定义一个路由,该路由将提供来自其他目录(例如实例文件夹)的受保护文件。看
不确定这是否是最好的方法,但我通常通过Flask提供文件,并通过nginx使这些文件不可访问(即,不要将它们放在静态文件夹中)。通过这种方式,您可以通过Flask登录控制访问。此链接可能会有所帮助:感谢Gohn67,在您提到这一点之前,我没有想过将它们从静态文件夹中移出。根据您的隐私问题,您可以让nginx检查是否存在与身份验证相关的cookie,并且只在找到静态文件时提供这些文件。感谢@dirn,很高兴知道我可以用nginx自己处理它。
import os
from flask import send_from_directory
from flask_login import login_required
@app.route('/protected/<path:filename>')
@login_required
def protected(filename):
return send_from_directory(
os.path.join(app.instance_path, 'protected'),
filename
)
url_for('protected', filename='data/example.csv')