Así que soy nuevo en el matraz y he estado trabajando en el desarrollo de una pequeña aplicación web localmente en mi computadora. No me he encontrado con demasiados problemas, pero no he podido hacer que mi página web devuelva un archivo csv al hacer clic en un enlace. Recibo un error que indica que falta la variable de entorno, según tengo entendido, puedo configurar esto para que sea un servidor que luego sirva el documento, sin embargo, espero hacer todo esto localmente en mi máquina.
@app.route('/sessions/csv_file') def get_csv_file(): return send_file('./sessions.csv',mimetype='csv',as_attachment=True, download_name='sessions.csv')editar: este código me da el siguiente error: TypeError: send_file () falta 1 argumento posicional requerido: 'environ'
Me aconsejaron que intentara usar mi aplicación como variable de entorno:
app = Flask(__name__) @app.route('/sessions/csv_file') def get_csv_file(): return send_file('./sessions.csv',mimetype='csv',as_attachment=True, download_name='sessions.csv', environ=app)Pero esto me da el siguiente error: TypeError: get() toma 2 argumentos posicionales pero se dieron 3
También probé esto con send_directory() y me encontré con el mismo error de entorno. ¡Si alguien es capaz de señalarme en la dirección correcta, sería muy apreciado!
editar: send_file() es una importación
from werkzeug.utils import send_fileComo se menciona en los comentarios de su publicación, hay dos versiones de send_file en el matraz.
uno de werkzeug.utils que puede importar como:
from werkzeug.utils import send_file otro del paquete del flask como
from flask import send_file send_file del paquete de matraz en realidad llama a send_file de werkzeug.utils con request.environ . Aquí está la implementación de send_file del matraz:
return werkzeug.utils.send_file( **_prepare_send_file_kwargs( path_or_file=path_or_file, environ=request.environ, mimetype=mimetype, as_attachment=as_attachment, download_name=download_name, attachment_filename=attachment_filename, conditional=conditional, etag=etag, add_etags=add_etags, last_modified=last_modified, max_age=max_age, cache_timeout=cache_timeout, ) Entonces, para corregir este error, reemplace send_file de werkzeug con la versión del matraz
from flask import send_file O asigne el último parámetro de su send_file ( environ ) con request.environ como se muestra a continuación:
return send_file('./sessions.csv',mimetype='csv',as_attachment=True, download_name='sessions.csv', environ=request.environ) Sin embargo, todavía hay una pequeña diferencia: las rutas relativas del archivo de envío de send_file se basan en la ruta raíz (si está utilizando planos de matraz, será el paquete de python actual). Pero las rutas werkzeug se refieren a la raíz de ejecución (generalmente el padre del paquete actual de python).