如何在 Django REST Framework 中返回自定義 JSON
Django Rest framework 是一個用於在 Django 中構建 API 的工具包。它提供處理 Python 中 HTTP 請求和響應的功能。Django Rest framework 使用序列化器和 Response 類來返回自定義 JSON 資料。在本文中,我們將探討在 Django REST Framework 中返回自定義 JSON 的不同方法,以及一些示例。
序列化器和 Response 類
Django Rest Framework(DRF) 使用序列化器將複雜的資料型別(例如 Django 模型)轉換為 JSON、XML 或其他可以輕鬆呈現為 HTTP 響應的內容型別。要返回自定義 JSON,您可以建立一個序列化器類,並使用 DRF 中的 Response 類來建立自定義響應。
語法
序列化器
serializers.FieldType()
在這裡,在序列化器類內部,我們使用所需的欄位型別(例如,CharField、IntegerField 等)定義欄位,並將它們分配給相應的欄位名稱。
Response 類
Response(data, status=status.HTTP_200_OK)
在這裡,我們從 rest_framework.response 模組匯入 Response 類,並從 rest_framework 匯入 status 模組。我們透過將要作為響應返回的資料和所需的 HTTP 狀態程式碼(例如 HTTP_200_OK)傳遞給 Response 類建構函式來建立響應物件。
示例
在下面的示例中,我們有一個名為 Book 的模型,其欄位包括標題、作者和價格。我們定義了一個序列化器類 BookSerializer,它將 Book 模型欄位對映到序列化器欄位。在 BookView 類的 get 方法內部,我們使用示例圖書資料建立序列化器例項。然後,我們驗證序列化器資料並使用 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 格式呈現響應。但是,我們可以定義自定義渲染器來修改響應結構或新增其他資訊。
示例
在下面的示例中,假設我們想在響應中新增元資料,例如圖書的總數。我們可以透過建立自定義渲染器並覆蓋 render 方法來實現這一點。為此,我們透過子類化 JSONRenderer 類建立一個自定義渲染器類 **CustomRenderer**。在 render 方法內部,我們透過新增表示圖書總數的 count 欄位和包含圖書資料的 results 欄位來修改資料。然後,我們呼叫父 render 方法以獲取包含修改後的資料的 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 REST Framework 的 Django 專案。以下是步驟
建立一個新的 Django 專案
$ django-admin startproject bookstore
在專案中建立一個新的 Django 應用
$ cd bookstore $ python manage.py startapp api
透過修改 settings.py 檔案配置 Django 專案和應用。將以下行新增到 INSTALLED_APPS 和 REST_FRAMEWORK 部分
INSTALLED_APPS = [ ... 'rest_framework', 'api', ] REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': [ 'api.renderers.CustomRenderer', ] }
在 api 應用目錄的 views.py 和 serializers.py 檔案中定義如上例所示的檢視和序列化器
更新專案目錄中的 urls.py 檔案以包含 API 端點
from django.urls import path from api.views import BookView urlpatterns = [ path('books/', BookView.as_view()), ]
執行開發伺服器
$ python manage.py runserver
在瀏覽器中訪問 URL books,您應該會看到包含圖書列表的自定義 JSON 響應。
結論
在本文中,我們討論瞭如何在 Django Rest Framework 中使用 Python Django 框架返回自定義 JSON。我們探討了實現此目標的不同方法,包括使用序列化器和 Response 類、使用渲染器自定義響應格式以及使用裝飾器進行響應自定義。透過使用上述方法,我們可以相應地轉換和格式化 JSON 響應。