日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django框架深入了解_03(DRF之认证组件、权限组件、频率组件、token)

發布時間:2024/9/30 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django框架深入了解_03(DRF之认证组件、权限组件、频率组件、token) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

閱讀目錄

  • 一、認證組件

    使用方法:
    token簡單描述:
    應用token編寫登錄接口:

  • 二、權限組件

    使用方法:

  • 三、頻率組件

    使用方法:

一、認證組件

回到頂部
使用方法:
①寫一個認證類,新建文件:my_examine.py

-------------------------------------------------------------------- 注:如果你對python感興趣,我這有個學習Python基地,里面有很多學習資料,感興趣的+Q群:895817687 --------------------------------------------------------------------# 導入需要繼承的基類BaseAuthentication from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions import AuthenticationFailed from app01 import models# 創建認證類,繼承BaseAuthentication class MyAuth(BaseAuthentication):# 固定寫一個authenticate方法用于定義具體認證內容def authenticate(self, request):# 寫認證邏輯代碼# 比如說假設token數據存在后端數據庫中,前端發送的請求需要認證tokentoken = request.GET.get('token')token_obj = models.Token.objects.filter(token=token).first()if token_obj:# 有值代表token校驗通過# 可以使用token_obj.user取到當前登錄的user對象# 這里需要返回2個數據return token_obj.user, token_objelse:raise AuthenticationFailed('未授權')

局部使用:在視圖類中添加認證:

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配置文件中取
-如果用戶在視圖類中配置了某個,先去用戶配置的取

總結:先取視圖類中配置的----》項目setting中取----》默認配置

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

# models.pyclass User(models.Model):name = models.CharField(max_length=32)password = models.CharField(max_length=64)choices = (('1', 'Super_Admin'), ('2', 'General_Admin'), ('3', 'General_User') )user_type = models.CharField(max_length=6, choices=choices, default='3')#跟User表做一對一關聯 class Token(models.Model):token = models.CharField(max_length=64)user = models.OneToOneField(to='User')

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中:

from rest_framework.permissions import BasePermission # 創建認證類,BasePermission class MyPermission(BasePermission):message = '權限不足,無法查看'# 固定寫一個has_permission方法用于定義具體權限內容def has_permission(self, request, view):# #因為權限在認證之后執行的,所有能取到reuqest.userif request.user.user_type == '1':return Trueelse:return False

局部使用:

-在視圖類中寫

permission_classes=[MyPermision,]全局使用:

在settings.py中配置

REST_FRAMEWORK={"DEFAULT_PERMISSION_CLASSES":["app01.my_examine.MyPermision",]}

局部禁用:

-在視圖類中寫 permission_classes = []

這里可以設置添加一個代碼讓返回顯示中文提示:

#在MyPermision類下面添加 message = ‘權限不足,無法查看’

三、頻率組件

回到頂部
使用方法:
①寫一個頻率類,仍然在my_examine.py中:

from rest_framework.throttling import SimpleRateThrottle class Throttle(SimpleRateThrottle):scope = 'info'def get_cache_key(self, request, view):return self.get_ident(request)

要點:繼承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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。