5

我正在使用 Flask 和 Flask-Restful 构建一个 API。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".

我已经阅读了 Flask 和 Flask-Restful 文档,但我不知道如何正确处理这个问题。

4

2 回答 2

0

只需创建一个子类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-14T20:38:50.687 回答
-1

基本上你想从 GET 方法中检索参数。请参考: Flask视图中如何获取url参数

于 2015-02-14T20:14:57.493 回答