Code source de src.utils_flask_sqla.response

import csv
import io
import json
from functools import wraps

from flask import Response, current_app
from werkzeug.datastructures import Headers


[docs] def json_resp_accept(accepted_list=[]): def json_resp(fn): """ Décorateur transformant le résultat renvoyé par une vue en objet JSON """ @wraps(fn) def _json_resp(*args, **kwargs): res = fn(*args, **kwargs) if isinstance(res, tuple): return to_json_resp(*res, accepted_list=accepted_list) else: return to_json_resp(res, accepted_list=accepted_list) return _json_resp return json_resp
[docs] json_resp = json_resp_accept()
[docs] json_resp_accept_empty_list = json_resp_accept([[]])
[docs] def to_json_resp( res, status=200, filename=None, as_file=False, indent=None, extension="json", accepted_list=[], ): if res is None: return ("", 204) headers = None if as_file: headers = Headers() headers.add("Content-Type", "application/json") headers.add( "Content-Disposition", "attachment", filename="export_{}.{}".format(filename, extension), ) return Response( current_app.json.dumps(res, ensure_ascii=False, indent=indent), status=status, mimetype="application/json", headers=headers, )
[docs] def csv_resp(fn): """ Décorateur transformant le résultat renvoyé en un fichier csv """ @wraps(fn) def _csv_resp(*args, **kwargs): res = fn(*args, **kwargs) filename, data, columns, separator = res return to_csv_resp(filename, data, columns, separator) return _csv_resp
[docs] def to_csv_resp(filename, data, columns, separator=";"): headers = Headers() headers.add("Content-Type", "text/plain") headers.add("Content-Disposition", "attachment", filename="export_%s.csv" % filename) out = generate_csv_content(columns, data, separator) return Response(out, headers=headers)
[docs] def generate_csv_content(columns, data, separator): fp = io.StringIO() writer = csv.DictWriter( fp, columns, delimiter=separator, quoting=csv.QUOTE_ALL, extrasaction="ignore" ) writer.writeheader() # ligne d'entête for line in data: writer.writerow(line) fp.seek(0) # Rembobinage du "fichier" return fp.read() # Retourne une chaine