Restringir el acceso a archivos estáticos para usuarios registrados

Quiero restringir los archivos para que estén disponibles para usuarios registrados, pero de lo contrario, devolveré un error 403 o similar. Por ejemplo, un usuario debería poder ver / descargar /static/data/example.csv solo si está conectado.

Sé cómo controlar la visualización real de los archivos utilizando Flask-Login si no están conectados, pero no cómo bloquear el acceso al archivo si visitan el enlace directamente en su navegador.

Flask agrega una ruta estática para servir archivos estáticos. Cuando estás en producción, normalmente “cortocircuitas” esta ruta para que Nginx sirva los archivos antes de que la solicitud llegue a tu aplicación. En lugar de agregar este “cortocircuito”, déjelo fuera y deje que Flask maneje las solicitudes. Sobrescriba la ruta estática con una que esté envuelta por login_required Flask-Login.

 from flask_login import login_required app.view_functions['static'] = login_required(app.send_static_file) 

Sin embargo, esto suele ser excesivo, ya que desea que los archivos verdaderamente estáticos se sirvan sin importar qué, para que las páginas se vean bien para los usuarios que no han iniciado sesión (de lo contrario, el CSS no se enviaría a la página de inicio de sesión). En su lugar, “cortocircuite” la carpeta estática que debe ser servida por Nginx, y defina una ruta que sirva para archivos protegidos desde algún otro directorio, como la carpeta de la instancia. Ver flask.send_from_directory .

 import os from flask import send_from_directory from flask_login import login_required @app.route('/protected/') @login_required def protected(filename): return send_from_directory( os.path.join(app.instance_path, 'protected'), filename ) 

Esto servirá los archivos del directorio “protegido” en la carpeta de la instancia para usuarios registrados solamente. También se pueden agregar otras restricciones, como permitir solo a ciertos usuarios acceder a ciertos archivos. Similar a la ruta estática, puede generar una url a un archivo con:

 url_for('protected', filename='data/example.csv')