drf : 請求(Request)與響應(Response),全域性設定和區域性設定drf的預設配置項。

冀未然發表於2024-03-25

請求(Request)與響應(Response)

請求(Request),當次的HTTP響應請求到Django中被封裝成python中的物件

  • request.data - POST, PUT請求的資料
  • request.query_params -GET請求的資料
    REST framework 傳入檢視的request物件不再是Django預設的HttpRequest物件,而是REST framework提供的擴充套件了HttpRequest類的Request類的物件。

REST framework 提供了Parser解析器,在接收到請求後會自動根據Content-Type指明的請求資料型別(如JSON、表單等)將請求資料進行parse解析,解析為類字典[QueryDict]物件儲存到Request物件中。

Request物件的資料是自動根據前端傳送資料的格式進行解析之後的結果。

無論前端傳送的哪種格式的資料,我們都可以以統一的方式讀取資料。

響應(Response),主要:data(HTTP的響應體),status(狀態碼),headers(HTTP的響應頭)

rest_framework.response.Response

繼承關係 ---> SimpleTemplateResponse ---> django的HttpResponse

構造方式

Response(data, status=None, template_name=None, headers=None, content_type=None)

data 資料不要是render處理之後的資料,只需傳遞python的內建型別資料即可,REST framework會使用renderer渲染器處理data。

data 不能是複雜結構的資料,如Django的模型類物件,對於這樣的資料我們可以使用Serializer序列化器序列化處理後(轉為了Python字典型別)再傳遞給data引數。

引數說明:

  • data: 為響應準備的序列化處理後的資料;
  • status: 狀態碼,預設200;
  • template_name: 模板名稱,在瀏覽器訪問看達到的模板,如果使用HTMLRenderer 時需指明;
  • headers: 用於存放響應頭資訊的字典;
  • content_type: 響應資料的Content-Type,通常此引數無需傳遞,REST framework會根據前端所需型別資料來設定該引數。

可以在rest_framework.settings查詢所有的drf預設配置項

全域性配置,在專案的settings.py 配置。
# 1. 後期 drf 的所有配置都寫在這個字典中
# 2. drf有個預設配置檔案(drf原始碼的--setting.py),如果沒有寫專案的配置檔案,則使用內建的,寫了優先使用專案的。
# 3. 返回樣式的配置,一般不配置。
REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (  # 預設響應渲染類
        'rest_framework.renderers.JSONRenderer',  # json渲染器
        'rest_framework.renderers.BrowsableAPIRenderer',  # 瀏覽API渲染器
    )
}

區域性配置,只針對某個檢視函式。

匯入模組:

from rest_framework.renderers import BrowsableAPIRenderer, JSONRenderer
class BookView(APIView):
  	# 區域性配置。儘管全域性配置了,優先使用區域性的。
    renderer_classes = [JSONRenderer]

    def post(self, request):
        print(request)
        ser = BookSerializers(data=request.data)
        if ser.is_valid():
            ser.save()
        return Response(ser.data)

    def get(self, request):
        book_list = Books.objects.all()
        # many=True 代表序列化多條資料
        ser = BookSerializers(instance=book_list, many=True)
        """
        <class 'rest_framework.serializers.ListSerializer'>
        ser 是ListSerializer的物件
        """
        print(type(ser))
        response = {'code': 100, 'msg': '查詢成功', 'result': ser.data}
        #
        return Response(response, status=status.HTTP_202_ACCEPTED, headers={'name': 'junjie'})

相關文章