Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 限制登录用户对静态文件的访问_Python_Nginx_Flask - Fatal编程技术网

Python 限制登录用户对静态文件的访问

Python 限制登录用户对静态文件的访问,python,nginx,flask,Python,Nginx,Flask,我想限制文件对登录用户可用,但否则返回403错误或类似错误。例如,用户只有在登录后才能查看/下载/static/data/example.csv 如果文件未登录,我知道如何使用Flask Login控制文件的实际显示,但如果他们直接在浏览器中访问链接,我知道如何阻止对文件的访问。Flask提供静态文件。在生产过程中,您通常会“短路”此路径,以便Nginx在请求到达应用程序之前提供文件。与其添加这个“短路”,不如省去它,让Flask处理请求。用Flask Login的Login\u require

我想限制文件对登录用户可用,但否则返回403错误或类似错误。例如,用户只有在登录后才能查看/下载
/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')