gpt4 book ai didi

python - Flask api 表示影响所有 View

转载 作者:行者123 更新时间:2023-11-30 23:08:34 27 4
gpt4 key购买 nike

我需要有两个逻辑上相同的 View 来响应不同内容类型中的相同数据。我使用 Flask RESTful。

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

有几个问题。添加表示 View 后,所有 View 都会返回带有适当标题的文本/csv 数据。 如何使用第一个 View 类返回 application/json 数据,第二个 View 类返回 text/csv 数据? 第二个问题是 CSV get 方法的返回值,如果我返回响应对象 returnflask.Response(data, mimetype='text/csv') 数据格式错误 - 只有键没有值。 如何在不损坏数据的情况下启用不同的 mimetype?

最佳答案

首先,请注意,您不应使用相同的资源来返回单个操作或操作列表。您应该使用两种不同的资源:

class Action(flask_restful.Resource):
def get(self, action_id):
return actions[action_id]

class ActionList(flask_restful.Resource):
def get(self):
return actions

然后,为同一资源返回不同媒体类型的最简单方法是使用内容协商。在这种情况下,您不需要声明专用资源 ActionAsCSV 来专门处理以 CSV 格式返回响应的情况。例如,要使用 curl 进行内容协商:

curl -iH“接受:text/csv”http://URL_TO_YOUR_VIEW

此外,Flask-RESTful 会自动在返回的响应中为您添加正确的 content-type header :您无需在 get 中定义它 您的资源的方法。

此外,API 默认配置为返回 JSON 格式的表示形式。但是,您可以按如下方式修改:

api = flask_restful.Api(app, default_mediatype="text/csv")

如果您绝对希望两个不同的资源来处理 application/jsontext/csv,而不使用内容协商且没有后备媒体类型,则这是可能的:

api = flask_restful.Api(app, default_mediatype=None)

class ActionListMixin(object):
def get(self):
return actions

class JsonActionList(ActionListMixin, flask_restful.Resource):
representations = {'application/json': output_json}

class CsvActionList(ActionListMixin, flask_restful.Resource):
representations = {'text/csv': output_csv}

另一个类似的选项是在添加资源时定义表示转换器:

api = flask_restful.Api(app, default_mediatype=None)

class ActionList(flask_restful.Resource):
def __init__(self, representations=None):
self.representations = representations
super(ActionList, self).__init__()

def get(self):
return actions

api.add_resource(ActionList, '/actions_json', resource_class_kwargs={'representations': {'application/json': output_json}})
api.add_resource(ActionList, '/actions_csv', resource_class_kwargs={'representations': {'text/csv': output_csv}})

关于python - Flask api 表示影响所有 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31654961/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com