Мне нужно иметь два логически идентичных представления для ответа на одни и те же данные в разных типах контента. Я использую Flask RESTful.Flask api-представление влияет на все виды
APP = flask.Flask(__name__)
API = flask_restful.Api(APP)
@API.representation('text/csv')
def output_csv(data, code, headers=None):
data_is_list = isinstance(data, types.ListType)
keys = data[0].keys() if data_is_list else data.keys()
output = io.BytesIO()
writer = csv.DictWriter(output, keys)
writer.writeheader()
encode = lambda v: v.encode('utf-8') if isinstance(
v, types.UnicodeType) else v
if data_is_list:
writer.writerows([{k: encode(v) for k, v in i.items()} for i in data])
else:
writer.writerow({k: encode(v) for k, v in data.items()})
resp = flask.make_response(output.getvalue(), code)
resp.headers.extend(headers or {})
return resp
class BaseAction(flask_restful.Resource):
def get(self, id=None):
# ...
return actions[0] if id else actions # Dict or list of dicts.
class ActionAsCSV(BaseAction):
def get(self, id=None):
data = super(ActionAsCSV, self).get(id, closed)
flask.Response(data, mimetype='text/csv')
return data
Есть несколько проблем. После того как я добавил представление представления, все представления возвращают данные text/csv с соответствующим заголовком. Как использовать первый класс представления для возврата данных приложения/json, а второй для возврата данных text/csv? Вторая проблема - это возвращаемое значение метода CSV get, если я возвращаю объект ответа return flask.Response(data, mimetype='text/csv')
, данные становятся искаженными - только ключи без значений. Как включить различный тип изображения без повреждения данных?