Поиск по сайту:

Как вернуть пользовательский 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.

Статьи по данной тематике: