Django框架深入了解_03(DRF之认证组件、权限组件、频率组件、token)
閱讀目錄
-
一、認證組件
使用方法:
token簡單描述:
應用token編寫登錄接口: -
二、權限組件
使用方法:
-
三、頻率組件
使用方法:
一、認證組件
回到頂部
使用方法:
①寫一個認證類,新建文件:my_examine.py
局部使用:在視圖類中添加認證:
from app01.my_examine import MyAuth # Create your views here.class Books(APIView):# 給Books視圖類添加token認證authentication_classes = [MyAuth, ]def get(self, request):response = {'code': 100, 'msg': '查詢成功'}books = models.Book.objects.all()books_ser = BookSer(instance=books, many=True)response['data'] = books_ser.datareturn Response(response)
全局認證使用方法設置:
在settings.py中配置
REST_FRAMEWORK={"DEFAULT_AUTHENTICATION_CLASSES":["app01.my_examine.MyAuth",]}全局認證已設置,視圖中的所有類都會進行設置值的認證,這顯然是不符合實際的,因為有些視圖不能設置認證,比如注冊,登錄
所以需要局部對認證進行認證禁用,方法:
在局部認證的視圖類位置添加下述代碼,完成局部禁用 authentication_classes = []
小結:(通過分析源碼)
-如果在項目的setting.py中配置了REST_FRAMEWORK,默認先從項目的setting中取
-如果取不到,才去默認的drf配置文件中取
-如果用戶在視圖類中配置了某個,先去用戶配置的取
token簡單描述:
token實現過程:用戶登錄成功后會在服務端通過自己的加密算法算出用戶相關的并且唯一的一串字符串(token)連同響應的數據一起發給前端,前端進行保存,在下次用戶訪問發送請求的時候會將token數據一并發給后端服務器,后端服務器首先就會對token進行校驗(這個校驗的地方可以是中間件也可以在視圖中),校驗的過程大致就是再次通過用戶相關數據進行加密算法算出這個用戶的token字符串,拿現在算出來的token與保存在前端用戶發送過來的token進行匹配,如果一致則代表用戶認證登錄成功,當然這個token是可以設置有效時間的。在一定程度上緩解了服務器的壓力。
token產生過程:
比如說我用HMAC-SHA256 算法,加上一個只有我才知道的密鑰, 對數據做一個簽名, 把這個簽名和數據一起作為token , 由于密鑰別人不
這個token服務端不保存, 前端發送請求時候會捎帶這個token,我再用同樣的HMAC-SHA256 算法和同樣的密鑰,對數據再計算一次簽名, 和token中的簽名做個比較, 如果相同, 我就知道用戶已經登錄過了,并且可以直接取到用戶的user id , 如果不相同, 數據部分肯定被人篡改過, 我就告訴前端用戶: 對不起,沒有認
Token 中的數據是明文保存的(雖然我會用Base64做下編碼, 但那不是加密), 還是可以被別人看到的, 所以我不能在其中保存像密碼這樣的敏感信息。
當然, 如果一個人的token 被別人偷走了, 那我也沒辦法, 我也會認為小偷就是合法用戶, 這其實和一個人的session id 被別人偷走是一樣的。
點我查看更多token相關信息。
應用token編寫登錄接口:
models.py
views.py
# views.pyfrom rest_framework.response import Response from app01.my_examine import MyAuth # Create your views here.from uuid import uuid4 from django.core.exceptions import ObjectDoesNotExist class Login(APIView):def post(self, request):response = {'code': 100, 'msg': '登錄成功'}name = request.data.get('name')password = request.data.get('password')try:# 使用get方法,get方法只能取一條數據,如果是多條或者取不到,則會拋異常user = models.User.objects.filter(name=name, password=password).get()# 通過try方法捕獲異常,如果走到這里說明沒有異常,get方法取到用戶對象,用戶登錄成功# 登錄成功需要進行token表的數據保存(這里先假設token是保存在服務端數據庫中)# 生成一個衛衣的id,使用uuid模塊token = uuid4()# token如果在用戶數據庫中存在則更新,沒有的話則創建# 使用update_or_create方法models.Token.objects.update_or_create(user=user, defaults={'token': token})# 將token放入返回的字典中response['token'] = token# 捕獲一個特別的異常,user對象如果不存在則會走此處except ObjectDoesNotExist as e:response['code'] = 101response['msg'] = '用戶名或密碼錯誤'# 捕獲其它異常except Exception as e:response['code'] = 102response['msg'] = '未知錯誤'# 返回前端數據return Response(response)添加路由:
url(r'^login/', views.Login.as_view()),二、權限組件 權限組件的使用方
法和認證組件基本相同:
使用方法:
①寫一個權限類,仍然在my_examine.py中:
局部使用:
-在視圖類中寫
permission_classes=[MyPermision,]全局使用:在settings.py中配置
REST_FRAMEWORK={"DEFAULT_PERMISSION_CLASSES":["app01.my_examine.MyPermision",]}局部禁用:
-在視圖類中寫 permission_classes = []
這里可以設置添加一個代碼讓返回顯示中文提示:
#在MyPermision類下面添加 message = ‘權限不足,無法查看’
三、頻率組件
回到頂部
使用方法:
①寫一個頻率類,仍然在my_examine.py中:
要點:繼承SimpleRateThrottle,重寫get_cache_key,返回self.get_ident(request),必須配置一個scop=字符串
② 在settings.py中配置:
REST_FRAMEWORK = {# 一分鐘內只能訪問6次'DEFAULT_THROTTLE_RATES': {'info': '6/m'} }③使用:
局部使用: 在視圖類中配置:
from app01.my_examine import Throttlefrom app01.my_examine import Throttle class PublishView(APIView):throttle_classes = [Throttle, ]def get(self, request):publish_list = models.Publish.objects.all()bs = PublishSer(publish_list, many=True)return Response(bs.data)全局使用:在setting中配置
'DEFAULT_THROTTLE_CLASSES':['自己定義的頻率類'],局部禁用
throttle_classes=[]總結
以上是生活随笔為你收集整理的Django框架深入了解_03(DRF之认证组件、权限组件、频率组件、token)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django框架深入了解_02(DRF之
- 下一篇: Django框架之DRF get pos