全局異常處理原理
# 對于前端來講,后端即便報錯,也要返回統(tǒng)一的格式,前端便于處理
{code:999,msg:'系統(tǒng)異常,請聯(lián)系系統(tǒng)管理員'}
# 只要三大認(rèn)證,視圖類的方法出了異常,都會執(zhí)行一個函數(shù):
rest_framework.views import exception_handler
# drf只要出了異常就會執(zhí)行 這是drf的配置文件中的
'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'
"""
dispatch中處理全局異常先走response = self.handle_exception(exc)
進(jìn)到handle_exception
exception_handler = self.get_exception_handler()
會去執(zhí)行配置文件配置的exception_handler這個函數(shù)
"""
# 但是源碼是不能改的 我們可以自定義一個函數(shù) 配置一下 以后出了異常 執(zhí)行我們自己的函數(shù)
"""
需要在項目的配置文件中配置上自己寫的這個函數(shù) 字典的v是函數(shù)的路徑
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
# 補(bǔ)充 內(nèi)置方法
isinstance() 判斷一個對象是不是某個類的對象 isinstance(對象,類)
issubclass() 判斷一個類,是不是另一個類的子類
全局異常處理代碼
# 我們自己自定義的函數(shù)
def common_exception_handler(exc,context):
# 只要走到這里,一定出異常了,我們正常的項目要記錄日志
res = exception_handler(exc,context)
# 兩種可能:應(yīng)該是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': '系統(tǒng)異常,請聯(lián)系系統(tǒng)管理員'})
return Response({'code':100,'msg':str(exc)})
# 項目的配置文件
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'app01.excepitons.common_exception_handler',
}
接口文檔
# 后端把接口寫好后
登錄接口
注冊接口
查詢所有圖書帶過濾接口
# 前端人員需要根據(jù)接口文檔,進(jìn)行前端開發(fā)
# 前后端需要做對接----》對接第一個東西就是這個接口文檔---》前端照著接口文檔開發(fā)
# 公司3個人,每個人開發(fā)了10個接口,3個人都要同時寫接口文檔
# 接口文檔的編寫形式
1.word,md編寫,大家都可以操作,寫完放在git上或者是公司的文檔管理平臺上
2.第三方的接口文檔平臺(收費(fèi))
https://www.showdoc.com.cn/
3.公司自己開發(fā)接口文檔平臺
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='站點(diǎn)頁面標(biāo)題'))
]
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發(fā)展歷史
會話管理
cookie:客戶端瀏覽器的鍵值對
session:服務(wù)端的鍵值對(djangosession表,內(nèi)存中,文件,緩存數(shù)據(jù)庫)
token:服務(wù)端生成的加密字符串,如果存在客戶端瀏覽器上,就叫cookie
三部分:頭,荷載,簽名
簽發(fā):登錄成功,簽發(fā)
認(rèn)證:認(rèn)證類中認(rèn)證
# jwt:Json web token (JWT),web方向的token認(rèn)證
長得樣子: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
文章來源地址http://www.zghlxwxcb.cn/news/detail-461041.html
base64編碼和解碼
# base64并不是一種加密反射,只是編碼解碼方式
# 字符串,可以轉(zhuǎn)成base64編碼格式:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
# eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 解碼成base64
import json
import base64
d = {'user_id':1,'username':'lqz'}
d_str = json.dumps(d)
# print(d_str)
# 對字符串進(jìn)行base64 編碼
res = base64.b64encode(bytes(d_str,encoding='utf-8'))
print(res) # b'eyJ1c2VyX2lkIjogMSwgInVzZXJuYW1lIjogImxxeiJ9'
# 解碼
res = base64.b64decode(res)
print(res)
# 括號內(nèi)也可以直接放一串字符串 長度必須是4的倍數(shù) 長度不夠時用=補(bǔ)齊
res = base64.b64decode('TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ=')
print(res)
# base64的用途
"""
1.在互聯(lián)網(wǎng)中 前后端數(shù)據(jù)交互使用base64編碼
2.jwt 字符串使用base64編碼
3.互聯(lián)網(wǎng)中一些圖片 使用base64編碼
"""
文章來源:http://www.zghlxwxcb.cn/news/detail-461041.html
到了這里,關(guān)于drf——全局處理異常、接口文檔、jwt介紹、based64編碼與解碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!