Django與drf 源碼視圖解析

0902自我總結

Django 與drf 源碼視圖解析

一.原生Django CBV 源碼分析:View

"""
1)as_view()是入口,獲得view函數地址
2)請求來了調用view函數,內部調用dispatch函數完成請求分發
3)dispatch函數將請求方式映射成視圖類的同名方法,完成請求的處理,獲得相應
4)再將相應的結果一層層返回
"""

二.drf CBV 源碼分析:APIView

"""
1)as_view()是入口,獲得view函數地址,在範圍view函數地址時局部禁用csrf認證
2)請求來了調用view函數,內部調用(APIView類的)dispatch函數完成請求分發
3)dispatch函數 二次封裝request、完成三大認證後,再將請求方式映射成視圖類的同名方法,完成請求的處理,獲得相應,再對相應作渲染處理
4)再將相應的結果一層層返回
"""

三.APIView作的處理

  • as_view: 就幹了一件事,禁用csrf認證python

  • dispatch:
    • 1)二次封裝request
    • 2)三大認證

四.drf 的局部渲染和全局渲染

經過看了源碼咱們對於渲染內容是JSONRenderer仍是BrowsableAPIRendererdjango

JSONRenderer與BrowsableAPIRenderer的導入json

from rest_framework.renderers import JSONRenderer from rest_framework.renderers import BrowsableAPIRendererapi

  • 局部設置app

    • 在咱們定義基礎APIView的類添加renderer_classes = [JSONRenderer]這樣網頁就不會出現渲染只顯示js數據

    例如iview

    class UserAPIView(APIView):
      renderer_classes = [JSONRenderer]
    
        def get(self, request, *args, **kwargs):
            print(request.query_params)
            data = {
                'status': 0,
                'msg': 'get ok',
                'results': [],
                'token': '123.12321.231'
            }
            return Response(
                data=data,
                status=status.HTTP_200_OK,
                headers={'Token': '123as.masd21.asd213sd'},
                content_type='application/json'  # 默認就是application/json
            )
  • 全局設置在setting函數

    # drf配置
    REST_FRAMEWORK = {
        # 響應的渲染模塊
        'DEFAULT_RENDERER_CLASSES': [
            'rest_framework.renderers.JSONRenderer',
            'rest_framework.renderers.BrowsableAPIRenderer',
        ],
        'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',  # 'application/json'
            'rest_framework.parsers.FormParser',  # 'application/x-www-form-urlencoded'
            'rest_framework.parsers.MultiPartParser'  # multipart/form-data
        ],
    }
相關文章
相關標籤/搜索