Flask Restful:根据 URL 参数更改表示
Flask Restful: change representation based on URL parameter
我正在使用 Flask 和 Flask-Restful 构建一个 API。 API 可能会被不同类型的工具(网络应用程序、自动化工具等)访问,其中一项要求是提供不同的表示形式(为了示例,我们假设 json 和 csv )
如 restful 文档中所述,根据内容类型更改序列化很容易,因此对于我的 CSV 序列化,我添加了以下内容:
@api.representation('text/csv')
def output_csv(data, code, headers=None):
#some CSV serialized data
data = 'some,csv,fields'
resp = app.make_response(data)
return resp
并且在使用 curl 并传递正确的 -H "Accept: text/csv"
参数时它工作正常。
问题是,由于某些浏览器可能会直接路由到 url 以下载 csv 文件,我希望能够通过 url 参数强制我的序列化,例如 http://my.domain.net/api/resource?format=csv
其中 format=csv
与 -H "Accept: text/csv"
.
具有相同的效果
我已经阅读了 Flask 和 Flask-Restful 文档,但我不知道如何正确处理这个问题。
基本上你想从 GET 方法中检索参数。请参阅:
How do I get the url parameter in a Flask view
简单地创建一个子class of Api
and override the mediatypes
方法:
from werkzeug.exceptions import NotAcceptable
class CustomApi(Api):
FORMAT_MIMETYPE_MAP = {
"csv": "text/csv",
"json": "application/json"
# Add other mimetypes as desired here
}
def mediatypes(self):
"""Allow all resources to have their representation
overriden by the `format` URL argument"""
preferred_response_type = []
format = request.args.get("format")
if format:
mimetype = FORMAT_MIMETYPE_MAP.get(format)
preferred_response_type.append(mimetype)
if not mimetype:
raise NotAcceptable()
return preferred_response_type + super(CustomApi, self).mediatypes()
我正在使用 Flask 和 Flask-Restful 构建一个 API。 API 可能会被不同类型的工具(网络应用程序、自动化工具等)访问,其中一项要求是提供不同的表示形式(为了示例,我们假设 json 和 csv )
如 restful 文档中所述,根据内容类型更改序列化很容易,因此对于我的 CSV 序列化,我添加了以下内容:
@api.representation('text/csv')
def output_csv(data, code, headers=None):
#some CSV serialized data
data = 'some,csv,fields'
resp = app.make_response(data)
return resp
并且在使用 curl 并传递正确的 -H "Accept: text/csv"
参数时它工作正常。
问题是,由于某些浏览器可能会直接路由到 url 以下载 csv 文件,我希望能够通过 url 参数强制我的序列化,例如 http://my.domain.net/api/resource?format=csv
其中 format=csv
与 -H "Accept: text/csv"
.
我已经阅读了 Flask 和 Flask-Restful 文档,但我不知道如何正确处理这个问题。
基本上你想从 GET 方法中检索参数。请参阅: How do I get the url parameter in a Flask view
简单地创建一个子class of Api
and override the mediatypes
方法:
from werkzeug.exceptions import NotAcceptable
class CustomApi(Api):
FORMAT_MIMETYPE_MAP = {
"csv": "text/csv",
"json": "application/json"
# Add other mimetypes as desired here
}
def mediatypes(self):
"""Allow all resources to have their representation
overriden by the `format` URL argument"""
preferred_response_type = []
format = request.args.get("format")
if format:
mimetype = FORMAT_MIMETYPE_MAP.get(format)
preferred_response_type.append(mimetype)
if not mimetype:
raise NotAcceptable()
return preferred_response_type + super(CustomApi, self).mediatypes()