1. 程式人生 > 其它 >DRF框架請求與響應

DRF框架請求與響應

目錄

DRF框架請求與響應

DRF 之Request

Request是包裝後的request,前面原始碼分析過了

不會DRF?原始碼都分析透了確定不來看? - HammerZe - 部落格園 (cnblogs.com)

前面的文章介紹到,新包裝的Request物件和原來django的request物件沒有什麼區別,使用方法一樣,只是多了request.data,當然區別也不止這一點,我們看一下目錄

request常用方法

  • 新包裝的Request物件是通過__getattr__方法反射過來的

        def __getattr__(self, attr):
            try:
                return getattr(self._request, attr)
            except AttributeError:
                return self.__getattribute__(attr)
    
  • 現在資料都可以通過request.data獲取

    @property
        def data(self):
            if not _hasattr(self, '_full_data'):
                self._load_data_and_files()
            return self._full_data
    
  • 原來request請求提交的資料在GET裡,現在請求引數可以通過request.query_parmas來查詢引數,也是被偽裝成資料屬性了,本質還是使用了原來request物件的GET,所以請求引數既可以從GET中取,也可以從request.query_params中取

    @property
        def query_params(self):
            """
            More semantically correct name for request.GET.
            """
            return self._request.GET
    

配置請求資料格式

預設的情況下,三種資料格式(urlencoded,formdata,json)都可以解析

比如當請求(post)過來要新增一條資料,那麼我們可以針對該請求的資料格式做要求,比如只能提交json格式,或者允許From-data和json等···通過寫介面實現,需要進行區域性(views)或者全域性配置(settings)

配置處理順序

  1. 區域性優先
  2. 全域性其次
  3. 預設配置最後

區域性配置

  • 匯入:from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
  • 配置引數:parser_classes

配置在檢視類裡

'''views.py'''
# 作者詳情檢視類
from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
class AuthorDetailView(APIView):

# 只處理json格式,預設三種格式都可以
    # parser_classes = [JSONParser, FormParser, MultiPartParser]
    parser_classes = [JSONParser]
    def post(self, request):
        # 獲取反序列化資料
        ser = serializer.AuthorDetailSerializer(data=request.data)
        if ser.is_valid():
            # 校驗通過存入資料庫,不需要重寫create方法了
            ser.save()
            return Response({'code': 100, 'msg': '新增成功', 'data': ser.data})
        # 校驗失敗
        return Response({'code': 101, 'msg': '校驗未通過', 'error': ser.errors})

注意

在區域性配置的時候千萬注意,如果parser_classes=[],那麼什麼資料格式都不解析

全域性配置

匯入from rest_framework import settings

原始碼解釋

'''Settings for REST framework are all namespaced in the REST_FRAMEWORK setting.
For example your project's `settings.py` file might look like this:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.TemplateHTMLRenderer',
    ],
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
    ],
}
'''

全域性settings.py配置

from rest_framework import settings

REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
    ],
}

'''預設是三種資料格式都解析的,想解析哪種寫哪種就行了'''

總結

  • 一般使用預設配置就可以了,如果需要搭配配置,區域性和全域性也可以一起使用

DRf 之 Response

匯入from rest_framework.response import Response

Reponse常用引數

原始碼

class Response(SimpleTemplateResponse):
    def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None):
        ·····
  • data:一般處理成字串,字典,列表等,給http響應body體中的內容

    注意,data可以從response物件中取出來二次處理,返回成我想要的樣子
    Response.data['msg'] = '再加點料'
    
  • status:響應狀態碼,可以匯入,比如:from rest_framework.status import HTTP_201_CREATED,但是建議自定義,不寫預設是200

  • headers:響應頭(字典)

ps:上三常用,下三瞭解即可

  • template_name:模板名稱,用瀏覽器訪問需要,預設使用DRF提供的,可以使用自己的
  • exception:異常處理
  • content_type:響應編碼格式

區域性配置

匯入from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer

  • JSONRenderer:json格式渲染器
  • BrowsableAPIRenderer:瀏覽API渲染器

通過renderer_classes配置解析格式

'''views.py'''
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer

class PublishView(APIView):
    renderer_classes = [JSONRenderer, ]

    ····

注意

如果只配置JSONRenderer,那麼瀏覽器訪問也是json格式資料

全域性配置

settings.py配置

預設兩種都解析,取各自所需

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (  # 預設響應渲染類
        'rest_framework.renderers.JSONRenderer',  # json渲染器
        'rest_framework.renderers.BrowsableAPIRenderer',  # 瀏覽API渲染器
    )
}

總結

  • 還是一般採用預設配置即可~