В классе Resource из библиотеки flask_restful атрибут representations используется для определения форматов, в которых ресурс может возвращать данные. Это позволяет вам указать, как данные должны быть представлены в ответе в зависимости от заголовка Accept в запросе.
Вот пример, как можно использовать representations в классе Resource:
from flask import Flask, Response
from flask_restful import Api, Resource, marshal_with, fields
from flask_restful.representations.json import output_json
from typing import Any, Dict, Optional
app = Flask(__name__)
api = Api(app)
# Define the data representation format
def output_xml(data: Any, code: int, headers: Optional[Dict[str, str]] = None) -> Response:
"""
Convert data to XML format and create a Flask response.
:param data: The data to be represented in XML format.
— это данные, которые возвращает метод `get`.
:param code: The HTTP status code.
:param headers: Optional headers to include in the response.
:return: A Flask Response object with XML data.
"""
# Example of converting data to XML
xml_data = '<data>' + str(data) + '</data>'
resp = app.make_response(xml_data, code)
resp.headers.extend(headers or {})
return resp
# Resource class
class MyResource(Resource):
# Specify available data representation formats
representations = {
'application/json': output_json,
'application/xml': output_xml,
}
@marshal_with({'message': fields.String})
def get(self) -> Dict[str, str]:
"""
Handle GET requests and return a message.
:return: A dictionary with a message.
"""
return {'message': 'Hello, World!'}
# Add the resource to the API
api.add_resource(MyResource, '/')
if __name__ == '__main__':
app.run(debug=True)В этом примере мы добавили поддержку XML в качестве формата представления данных. Метод output_xml преобразует данные в XML-формат. Затем мы указали этот метод в representations класса MyResource. Теперь, когда клиент отправляет запрос с заголовком Accept: application/xml, данные будут возвращены в формате XML.
В этом примере output_xml принимает данные, которые возвращает метод get, и преобразует их в XML-формат. Затем создается объект Response, который возвращается клиенту.
Вот цепочка вызовов для примера использования representations в классе Resource, представленная в виде вложенных списков:
-
Клиент отправляет HTTP GET запрос на
/- Заголовок
Acceptможет бытьapplication/jsonилиapplication/xml.
- Заголовок
-
Flask принимает запрос
- Flask передает управление в
flask_restful.Api.
- Flask передает управление в
-
Apiобрабатывает запрос- Вызывает метод
dispatch_requestклассаResource.
- Вызывает метод
-
MyResource.dispatch_request- Определяет метод HTTP (в данном случае
GET). - Вызывает метод
get.
- Определяет метод HTTP (в данном случае
-
MyResource.get- Возвращает данные:
{'message': 'Hello, World!'}.
- Возвращает данные:
-
marshal_withдекоратор- Применяет маршалинг к данным, используя указанные поля.
-
MyResource.representations- Определяет, какой метод использовать для представления данных в зависимости от заголовка
Accept. - Если
Accept: application/json, используетсяoutput_json. - Если
Accept: application/xml, используетсяoutput_xml.
- Определяет, какой метод использовать для представления данных в зависимости от заголовка
-
Метод представления данных
- Преобразует данные в указанный формат.
- Создает объект ответа с преобразованными данными.
-
Flask возвращает ответ клиенту
- Ответ содержит данные в формате, указанном в заголовке
Accept.
- Ответ содержит данные в формате, указанном в заголовке
Эта последовательность показывает, как запрос обрабатывается от момента его получения до отправки ответа клиенту, с учетом использования representations для выбора формата данных.