python - 安息 flask : change representation based on URL parameter

标签 python flask flask-restful

我正在使用 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 文档,但我不知道如何正确处理这个问题。

最佳答案

简单地创建一个子类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()

关于python - 安息 flask : change representation based on URL parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28519791/

相关文章:

python - 如何使用 if __name__== '__main__' 在 Linux 和 Windows 上运行 python 应用程序

python - 针对每个 HTTP 方法的 Flask-RESTful 自定义路由

javascript - 给定低位和高位,如何生成 64 位二进制补码整数?

python - 在 matlab 引擎中运行 start_matlab 时出现段错误

python - 加载 MySQLdb 模块时出错 : No module named 'MySQLdb'

python - Flask 和 SQLAlchemy,应用程序未在实例上注册

python - 具有一对多关系的 Flask-Migration

flask - View 函数未返回有效响应。 flask 棉花糖,RestAPI

python - Flask RESTful 销毁用户 token

python - 使用 Python 日志记录发送电子邮件