Как вернуть пользовательский JSON в Django REST Framework
Среда Django Rest — это набор инструментов, используемый для создания API в Django. Он предоставляет функции и возможности для обработки HTTP-запросов и ответов в Python. Платформа Django Rest использует сериализаторы и классы Response для возврата пользовательских данных JSON. В этой статье мы рассмотрим различные подходы к возврату пользовательского JSON в Django REST Framework, а также приведем примеры.
Сериализаторы и класс ответа
Django Rest Framework (DRF) использует сериализаторы для преобразования сложных типов данных, таких как модели Django, в JSON, XML или другие типы контента, которые можно легко преобразовать в ответы HTTP. Чтобы вернуть собственный JSON, вы можете создать класс сериализатора и использовать класс Response из DRF для создания специального ответа.
Синтаксис
Серайлзеры
serializers.FieldType()
Здесь внутри класса сериализатора мы определяем поля, используя желаемый тип поля (например, CharField, IntegerField и т. д.) и присваиваем им соответствующие имена полей.
Класс ответа
Response(data, status=status.HTTP_200_OK)
Здесь мы импортируем класс Response из модуля rest_framework.response и модуль статуса из rest_framework. Мы создаем объект ответа, передавая данные, которые хотим вернуть в качестве ответа, и желаемый код состояния HTTP, например HTTP_200_OK, конструктору класса Response.
Пример
В приведенном ниже примере у нас есть модель под названием «Книга» с такими полями, как название, автор и цена. Мы определяем класс сериализатора BookSerializer, который сопоставляет поля модели Book с полями сериализатора. Внутри метода get класса BookView мы создаем экземпляр сериализатора с образцами данных книги. Затем мы проверяем данные сериализатора и извлекаем сериализованные данные с помощью Serializer.data. Наконец, мы возвращаем сериализованные данные, используя класс Response с кодом состояния HTTP 200.
from rest_framework import serializers, status
from rest_framework.response import Response
from rest_framework.views import APIView
class BookSerializer(serializers.Serializer):
title = serializers.CharField()
author = serializers.CharField()
price = serializers.DecimalField(max_digits=5, decimal_places=2)
class BookView(APIView):
def get(self, request):
books_data = [
{'title': 'Book 1', 'author': 'Author 1', 'price': 9.99},
{'title': 'Book 2', 'author': 'Author 2', 'price': 14.99},
{'title': 'Book 3', 'author': 'Author 3', 'price': 19.99}
]
serializer = BookSerializer(data=book_data)
serializer.is_valid(raise_exception=True)
response_data = serializer.data
return Response(response_data, status=status.HTTP_200_OK)
Выход
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
[
{
"title": "Book 1",
"author": "Author 1",
"price": "9.99"
},
{
"title": "Book 2",
"author": "Author 2",
"price": "14.99"
},
{
"title": "Book 3",
"author": "Author 3",
"price": "19.99"
}
]
Настройка формата ответа
Django Rest Framework предоставляет возможность настроить формат ответа с помощью модуля рендереры. По умолчанию DRF использует класс JSONRenderer для отображения ответов в формате JSON. Однако мы можем определить собственные средства визуализации, чтобы изменить структуру ответа или добавить дополнительную информацию.
Пример
В приведенном ниже примере предположим, хотим ли мы добавить к нашему ответу метаданные, например общее количество книг. Мы можем добиться этого, создав собственный модуль рендеринга и переопределив метод рендеринга. Для этого мы создаем собственный класс рендеринга CustomRenderer путем создания подкласса класса JSONRenderer. Внутри метода рендеринга мы модифицируем данные, добавляя поле счетчика, которое представляет общее количество книг, и поле результатов, содержащее данные книги. Затем мы вызываем родительский метод рендеринга, чтобы получить ответ JSON с измененными данными.
from rest_framework import renderers
class CustomRenderer(renderers.JSONRenderer):
def render(self, data, accepted_media_type=None, renderer_context=None):
response_data = {'count': len(data), 'results': data}
return super().render(response_data, accepted_media_type, renderer_context)
class BookView(APIView):
renderer_classes = [CustomRenderer]
def get(self, request):
books = ['Book 1', 'Book 2', 'Book 3']
return Response(books, status=status.HTTP_200_OK)
Выход
{"count":3,"results":["Book 1","Book 2","Book 3"]}
Использование декораторов ответа
Django Rest Framework предоставляет декораторы для упрощения процесса возврата пользовательских ответов. Декоратор @api_view позволяет указать желаемый формат ответа с помощью аргумента renderer_classes.
Пример
В приведенном ниже примере мы определяем функцию просмотра под названием «books» и украшаем ее декоратором @api_view, чтобы указать, что она должна обрабатывать только запросы GET. Мы также используем декоратор @renderer_classes, чтобы указать, что ответ должен быть обработан с использованием нашего специального средства визуализации CustomRenderer. Внутри функции мы возвращаем в качестве ответа список книг.
from rest_framework.decorators import api_view, renderer_classes
@api_view(['GET'])
@renderer_classes([CustomRenderer])
def books(request):
books = ['Book 1', 'Book 2', 'Book 3']
return Response(books, status=status.HTTP_200_OK)
Выход
{"count":3,"results":["Book 1","Book 2","Book 3"]}
Запуск примера
Чтобы запустить пример и увидеть результат, вам необходимо настроить проект Django с установленной платформой Django REST Framework. Вот шаги:
Создайте новый проект Django:
$ django-admin startproject bookstore
Создайте новое приложение Django в проекте:
$ cd bookstore
$ python manage.py startapp api
Настройте проект и приложение Django, изменив файл settings.py. Добавьте следующие строки в разделы INSTALLED_APPS и REST_FRAMEWORK:
INSTALLED_APPS = [
...
'rest_framework',
'api',
]
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'api.renderers.CustomRenderer',
]
}
-
Определите представления и сериализаторы, как указано в примерах выше, внутри файловviews.py иserializers.py в каталоге приложения API.
Обновите файл urls.py в каталоге проекта, включив в него конечные точки API:
from django.urls import path
from api.views import BookView
urlpatterns = [
path('books/', BookView.as_view()),
]
Запустите сервер разработки
$ python manage.py runserver
Откройте URL-адрес книг в своем браузере, и вы должны увидеть пользовательский ответ JSON, содержащий список книг.
Заключение
В этой статье мы обсудили, как мы можем вернуть пользовательский JSON в Django Rest Framework, используя среду Python Django. Мы рассмотрели различные подходы для достижения этой цели, в том числе использование сериализаторов и класса Response, настройку формата ответа с помощью средств визуализации и использование декораторов для настройки ответа. Используя вышеуказанные методы, мы можем соответствующим образом преобразовать и отформатировать ответы JSON.