Flask Restful:根据URL参数更改表示

时间:2015-02-14 20:11:07

标签: python flask flask-restful

我正在使用Flask和Flask-Restful构建API。可以通过不同类型的工具(Web应用程序,自动化工具等)访问API,其中一个要求是提供不同的表示(假设为了示例,请说json和csv)

正如在restful doc中所解释的那样,根据内容类型更改序列化很容易,因此对于我的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"参数时,它正常工作。

问题在于,由于某些浏览器可能会直接路由到网址以下载csv文件,因此我希望能够通过url参数强制进行序列化,例如http://my.domain.net/api/resource?format=csv format=csv }与-H "Accept: text/csv"具有相同的效果。

我已经浏览了Flask和Flask-Restful文档,但我没有看到如何正确处理这个问题。

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:-1)

基本上你想从GET方法中检索参数。请参阅: How do I get the url parameter in a Flask view