若要自定义 XML 或 JSON 格式的响应媒体类型,需要按以下方式定义。

您需要定义一个 Flask 实例和 api 实例:

app = Flask(__name__)
api = Api(app)

然后,您需要定义支持的表示。

要声明 XML 响应格式,请定义以下内容:

@api.representation('application/xml')
def output_xml(data, code, headers=None):
	resp = make_response(dumps({'response' : data}), code)
	resp.headers.extend(headers or {})
	return resp

要声明 JSON 响应格式,请执行以下操作:

@api.representation('application/json')
def output_json(data, code, headers=None):
	resp = make_response(json.dumps({'response' : data}), code)
	resp.headers.extend(headers or {})
	return resp

默认情况下,api = Api(app)响应格式为 JSON 格式,但如果您仍想为 REST API 设置默认响应格式,则可以将 API 实例更改为 api = Api(app, default_mediatype='application/json')

您还可以使用以下方式来声明响应格式。@api.representation()

api.representations['application/json'] = output_json
api.representations['application/xml'] = output_xml

您还可以通过使用自己的输出函数对 Api 类进行子类化来声明不同的响应格式:

class Api(restful.Api):
    def __init__(self, *args, **kwargs):
        super(Api, self).__init__(*args, **kwargs)
        self.representations = {
            'application/xml': output_xml,
            'text/html': output_html,
            'text/csv': output_csv,
            'application/json': output_json,
        }

让我们看一下示例的实现部分。

先决条件

Python 3.9.0、Flask 1.1.2 (pip install flask)、Flask-Restful 0.3.8 (pip install flask-restful)、Python-Simplexml 0.1.5 (pip install python-simplexml)

程序目录

您可以在系统中的任何位置为应用创建根目录。

我的示例的根目录名称是 python-flask-rest-api-multiple-response-formats

将本示例所有的 Python 脚本都保存在这个根文件夹中。

REST 资源类

我要创建的第一件事是REST资源类。

 rest.py 

from flask import request
from flask_restful import Resource

class Greet(Resource):

	def get(self):
		return {'message' : 'Hello, how are you?'}
	
	def post(self):
		req = request.get_json()
		print('req', req)
		return req, 201

class GreetName(Resource):
	def get(self, name):
		return {'message' : 'Hello ' + name + ', how are you?'}

我创建了两个类——Greet 和 GreetName。Greet 类定义了两个函数 get()post() . 用于资源获取或提取数据,并用于在服务器中创建新资源。

REST 配置

在这里,我将声明JSON和XML响应格式,REST API路由。

 app.py 

import rest
import json
from simplexml import dumps
from flask import Flask, make_response
from flask_restful import Api

app = Flask(__name__)

api = Api(app)
#api = Api(app, default_mediatype='application/json')

@api.representation('application/json')
def output_json(data, code, headers=None):
	resp = make_response(json.dumps({'response' : data}), code)
	resp.headers.extend(headers or {})
	return resp

@api.representation('application/xml')
def output_xml(data, code, headers=None):
	resp = make_response(dumps({'response' : data}), code)
	resp.headers.extend(headers or {})
	return resp

#api.representations['application/json'] = output_json
#api.representations['application/xml'] = output_xml

api.add_resource(rest.Greet, '/')
api.add_resource(rest.GreetName, '/<string:name>')

if __name__ == "__main__":
	app.run()

创建应用程序和 api 实例后,我声明了响应格式。

测试应用程序

网址: http://localhost:5000/

默认情况下,响应为 JSON,如下图所示:

用Flask REST API 返回不同的响应格式(JSON、XML)_xml

如果需要 XML 格式的响应,请在标头中添加 Accept/(application/xml) 键/值对。

用Flask REST API 返回不同的响应格式(JSON、XML)_json_02

对于POST请求,没有处理输入数据,只是在响应中返回。

用Flask REST API 返回不同的响应格式(JSON、XML)_rest api返回_03

网址:http://localhost:5000/<name>

通过名称作为路径参数传递的响应。

默认格式为 JSON。

您还可以通过在 HTTP 标头中设置 Accept/(application/xml) 键/值对来检查 XML 响应。

用Flask REST API 返回不同的响应格式(JSON、XML)_rest api返回_04