drf——全域性處理異常、介面檔案、jwt介紹、based64編碼與解碼

2023-05-27 15:00:22

全域性例外處理原理

# 對於前端來講,後端即便報錯,也要返回統一的格式,前端便於處理
{code:999,msg:'系統異常,請聯絡系統管理員'}

# 只要三大認證,檢視類的方法出了異常,都會執行一個函數:
	rest_framework.views import exception_handler

# drf只要出了異常就會執行 這是drf的組態檔中的
	'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'
# 但是原始碼是不能改的 我們可以自定義一個函數 設定一下 以後出了異常 執行我們自己的函數
"""
需要在專案的組態檔中設定上自己寫的這個函數 字典的v是函數的路徑
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'app01.excepitons.common_exception_handler',
}
"""
# 注意:exception_handler
"""
如果異常物件是drf的APIException的物件,就會返回Response
exception_handler只處理了drf的異常,其他的異常需要我們自己處理
如果異常物件不是drf的APIException物件,就會返回None
"""
# exception_handler原始碼:
	def exception_handler(exc, context):  # 如果有異常會走這
        if isinstance(exc, exceptions.APIException):  # 判斷是否是APIException的物件 是就返回Response 不是返回None
            if isinstance(exc.detail, (list, dict)):
                data = exc.detail
            else:
                data = {'detail': exc.detail}
            return Response(data, status=exc.status_code, headers=headers)
    	return None
    
# 補充 內建方法
isinstance()  判斷一個物件是不是某個類的物件 isinstance(物件,類)
issubclass()  判斷一個類,是不是另一個類的子類

全域性例外處理程式碼

# 我們自己自定義的函數

def common_exception_handler(exc,context):
    # 只要走到這裡,一定出異常了,我們正常的專案要記錄紀錄檔
    res = exception_handler(exc,context)
    # 兩種可能:應該是Response物件,一個是None
    if res:
        if isinstance(res.data,dict)
        # 如果res有值 說明是drf的異常,它處理了
        	detail = res.data.get('detail')
        else:
            detail = res.data
        return Response({'code':999,'msg':detail})
    else:
        # 如果res沒有值返回的是None 則說明是其他異常,它沒有處理
        # return Response({'code': 999, 'msg': '系統異常,請聯絡系統管理員'})
        return Response({'code':100,'msg':str(exc)})
    
# 專案的組態檔
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'app01.excepitons.common_exception_handler',
}

介面檔案

# 後端把介面寫好後
	登入介面
    註冊介面
    查詢所有圖書帶過濾介面
# 前端人員需要根據介面檔案,進行前端開發

# 前後端需要做對接----》對接第一個東西就是這個介面檔案---》前端照著介面檔案開發
# 公司3個人,每個人開發了10個介面,3個人都要同時寫介面檔案

# 介面檔案的編寫形式
	1.word,md編寫,大家都可以操作,寫完放在git上或者是公司的檔案管理平臺上
    2.第三方的介面檔案平臺(收費)
    	https://www.showdoc.com.cn/
    3.公司自己開發介面檔案平臺
    4.公司使用開源的介面檔案平臺,搭建
    	-YAPI:百度開源的
        -https://zhuanlan.zhihu.com/p/366025001 # 如何搭建
    5.專案自動生成介面檔案
    	5.1 coreapi
        5.2 swagger
        
# 使用coreapi自動生成介面檔案
	使用步驟:
    	1. 安裝:pip38 install coreapi
        2.加一個路由
        	from rest_framework.documentation import include_docs_urls
            urlpatterns = [
                path('docs/',include_docs_urls(title='站點頁面標題'))
            ]
        3.在檢視類上加註釋
       	4.組態檔中設定
        'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema'
        5.表模型或序列化類的欄位上寫 help_text--->會顯示在介面檔案的欄位介紹上
        6.存取地址:
        	http://127.0.0.1:8000/docs/

jwt介紹和原理

# https://www.cnblogs.com/liuqingzheng/p/16154439.html

# cookie,session,token發展歷史
	對談管理
    cookie:使用者端瀏覽器的鍵值對
    session:伺服器端的鍵值對(djangosession表,記憶體中,檔案,快取資料庫)
    token:伺服器端生成的加密字串,如果存在使用者端瀏覽器上,就叫cookie
    	三部分:頭,荷載,簽名
        簽發:登入成功,簽發
        認證:認證類中認證
        
# jwt:Json web token (JWT),web方向的token認證
	長得樣子:   eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

base64編碼和解碼

# base64並不是一種加密反射,只是編碼解碼方式
# 字串,可以轉成base64編碼格式:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
# eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 解碼成base64

import json
import base64

d = {'user_id':1,'username':'lqz'}
d_str = json.dumps(d)
# print(d_str)
# 對字串進行base64 編碼
res = base64.b64encode(bytes(d_str,encoding='utf-8'))
print(res)  # b'eyJ1c2VyX2lkIjogMSwgInVzZXJuYW1lIjogImxxeiJ9'
# 解碼
res = base64.b64decode(res)
print(res)
# 括號內也可以直接放一串字串 長度必須是4的倍數 長度不夠時用=補齊
res = base64.b64decode('TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ=')
print(res)

# base64的用途
"""
1.在網際網路中 前後端資料互動使用base64編碼
2.jwt 字串使用base64編碼
3.網際網路中一些圖片 使用base64編碼
"""