我正在构建一个API使用水瓶和瓶-Restful。API可以通过不同类型的工具(web应用程序、自动化工具等)访问。其中一个要求是提供不同的表示(比如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"相同的效果。
我已经看过了烧瓶和烧瓶-Restful文档,我看不出如何正确地处理这个问题。
发布于 2015-02-14 20:38:50
只需创建Api的子类并重写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()发布于 2015-02-14 20:14:57
基本上,您希望从GET方法中检索参数。请参阅:How do I get the url parameter in a Flask view
https://stackoverflow.com/questions/28519791
复制相似问题