解析模塊,異常模塊,響應模塊

解析模塊

1.爲何要配置解析模塊?

  1)drf給咱們配置了多種解析數據包方式的解析類json

  2)咱們能夠經過配置來控制前臺提交的數據,肯定哪些格式的數據須要在後臺解析,哪些數據不解析api

  3)全局配置就是針對每個視圖類,局部配置就是針對指定的視圖來,讓它們能夠按照配置規則選擇性解析數據。服務器

2.解析模塊的源碼分析

1)先進入到APIView類的dispatch方法中(源碼入口)。網絡

 2)從request = self.initialize_request(request, *args, **kwargs)中進去,獲取解析類函數

 3)從parsers=self.get_parsers()中進去, 去類屬性(局部配置) 或 配置文件(全局配置) 拿 parser_classes源碼分析

 3.全局配置 :在settings.py文件完成

 1 # 自定義drf配置 - 全局配置
 2 REST_FRAMEWORK = {
 3     'DEFAULT_RENDERER_CLASSES': [
 4         'rest_framework.renderers.JSONRenderer',
 5         'rest_framework.renderers.BrowsableAPIRenderer',
 6     ],
 7     # 全局解析類配置
 8     'DEFAULT_PARSER_CLASSES': [
 9         'rest_framework.parsers.JSONParser',    # json數據包
10         'rest_framework.parsers.FormParser',    # urlencoding數據包
11         'rest_framework.parsers.MultiPartParser'    # form-date數據包
12     ],
13     # 全局配置異常模塊
14     'EXCEPTION_HANDLER': 'api.exception.exception_handler',
15 }

4.局部配置:應用views.py的具體視圖類

from rest_framework.parsers import JSONParser

class Book(APIView):
    parser_classes = [JSONParser]   # 局部解析類配置,只有json類型的數據包才能被解析
    def get(self, request, *args, **kwargs):    # get方法
        pk = kwargs.get('pk')
        if pk:
            book_obj = models.Book.objects.get(pk=pk)
            return Response({
                'status': 0,    # 狀態碼
                'msg': 'ok',    # 狀態信息
                'results': {
                    'title': book_obj.title,
                    'price': book_obj.price
                }
            })
        return Response('get ok')

    def post(self, request, *args, **kwargs):    # post方法
        # url拼接參數:只有一種傳參方式就是拼接參數
        print(request.query_params)
        # 數據包參數:有三種傳承方式,form-data、urlencoding、json
        print(request.data)
        return Response('post ok')

 異常模塊

1.爲何要自定義異常模塊

  1)全部通過drf的APIView視圖類產生的異常,均可以提供異常處理方案post

  2)drf默認提供了異常處理方案(rest_framework.views.exception_handler),可是處理範圍有限url

  3)drf提供的處理方案兩種,處理了返回異常現象,沒處理返回None(後續就是服務器拋異常給前臺)spa

  4)自定義異常的目的:就是爲了 解決drf沒有處理的異常,讓前臺獲得合理的異常信息返回,後臺記錄異常具體信息3d

2.異常模塊的源碼分析

1)先進入APIView類的dispatch方法中(源碼入口)

2)獲取處理異常的方法

  一層層看源碼,走的是配置文件,拿到的是rest_framework.views的exception_handler()

  自定義:直接寫exception_handler函數,在本身的配置文件配置EXCEPTION_HANDLER指向本身的

      exception_handler = self.get_exception_handler()

3) 異常處理的結果

  自定義異常就是提供exception_handler異常處理函數,處理的目的就是讓response必定有值

  response = exception_handler(exc, context)

3.如何使用:自定義exception——handler函數如何實現體

1 # 修改本身的配置文件setting.py
2 REST_FRAMEWORK = {
3     # 全局配置異常模塊
4     'EXCEPTION_HANDLER': 'api.exception.exception_handler',
5 }
# 1)先將異常處理交給rest_framework.views的exception_handler去處理
# 2)判斷處理的結果(返回值)response,有值表明drf已經處理了,None表明須要本身處理

# 自定義異常處理文件exception,在文件中書寫exception_handler函數
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.views import Response
from rest_framework import status
def exception_handler(exc, context):
    # drf的exception_handler作基礎處理
    response = drf_exception_handler(exc, context)
    # 爲空,自定義二次處理
    if response is None:
        # print(exc)
        # print(context)
        print('%s - %s - %s' % (context['view'], context['request'].method, exc))
        return Response({
            'detail': '服務器錯誤'
        }, status=status.HTTP_500_INTERNAL_SERVER_ERROR, exception=True)
    return response

響應模塊 

 1 from rest_framework.response import Response

2 def __init__(self, data=None, status=None, 3 template_name=None, headers=None, 4 exception=False, content_type=None): 5 """ 6 :param data: 響應數據 7 :param status: http響應狀態碼 8 :param template_name: drf也能夠渲染頁面,渲染的頁面模板地址(不用瞭解) 9 :param headers: 響應頭 10 :param exception: 是否異常了 11 :param content_type: 響應的數據格式(通常不用處理,響應頭中帶了,且默認是json) 12 """

使用:常規實例化響應對象

1 # status就是解釋一堆 數字 網絡狀態碼的模塊
2 from rest_framework import status   就是解釋一堆 數字 網絡狀態碼的模塊
3 # 通常狀況下只須要返回數據,status和headers都有默認值
4 return Response(data={數據}, status=status.HTTP_200_OK, headers={設置的響應頭})
相關文章
相關標籤/搜索