全域性例外處理原理
# 對於前端來講,後端即便報錯,也要返回統一的格式,前端便於處理
{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編碼
"""