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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

閱讀目錄

  • 一、認(rèn)證組件

    使用方法:
    token簡(jiǎn)單描述:
    應(yīng)用token編寫登錄接口:

  • 二、權(quán)限組件

    使用方法:

  • 三、頻率組件

    使用方法:

一、認(rèn)證組件

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

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

局部使用:在視圖類中添加認(rèn)證:

from app01.my_examine import MyAuth # Create your views here.class Books(APIView):# 給Books視圖類添加token認(rèn)證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)


全局認(rèn)證使用方法設(shè)置:

在settings.py中配置

REST_FRAMEWORK={"DEFAULT_AUTHENTICATION_CLASSES":["app01.my_examine.MyAuth",]}

全局認(rèn)證已設(shè)置,視圖中的所有類都會(huì)進(jìn)行設(shè)置值的認(rèn)證,這顯然是不符合實(shí)際的,因?yàn)橛行┮晥D不能設(shè)置認(rèn)證,比如注冊(cè),登錄

所以需要局部對(duì)認(rèn)證進(jìn)行認(rèn)證禁用,方法:

在局部認(rèn)證的視圖類位置添加下述代碼,完成局部禁用 authentication_classes = []

小結(jié):(通過分析源碼)

-如果在項(xiàng)目的setting.py中配置了REST_FRAMEWORK,默認(rèn)先從項(xiàng)目的setting中取
-如果取不到,才去默認(rèn)的drf配置文件中取
-如果用戶在視圖類中配置了某個(gè),先去用戶配置的取

總結(jié):先取視圖類中配置的----》項(xiàng)目setting中取----》默認(rèn)配置

token簡(jiǎn)單描述:
token實(shí)現(xiàn)過程:用戶登錄成功后會(huì)在服務(wù)端通過自己的加密算法算出用戶相關(guān)的并且唯一的一串字符串(token)連同響應(yīng)的數(shù)據(jù)一起發(fā)給前端,前端進(jìn)行保存,在下次用戶訪問發(fā)送請(qǐng)求的時(shí)候會(huì)將token數(shù)據(jù)一并發(fā)給后端服務(wù)器,后端服務(wù)器首先就會(huì)對(duì)token進(jìn)行校驗(yàn)(這個(gè)校驗(yàn)的地方可以是中間件也可以在視圖中),校驗(yàn)的過程大致就是再次通過用戶相關(guān)數(shù)據(jù)進(jìn)行加密算法算出這個(gè)用戶的token字符串,拿現(xiàn)在算出來的token與保存在前端用戶發(fā)送過來的token進(jìn)行匹配,如果一致則代表用戶認(rèn)證登錄成功,當(dāng)然這個(gè)token是可以設(shè)置有效時(shí)間的。在一定程度上緩解了服務(wù)器的壓力。

token產(chǎn)生過程:

比如說我用HMAC-SHA256 算法,加上一個(gè)只有我才知道的密鑰, 對(duì)數(shù)據(jù)做一個(gè)簽名, 把這個(gè)簽名和數(shù)據(jù)一起作為token , 由于密鑰別人不

這個(gè)token服務(wù)端不保存, 前端發(fā)送請(qǐng)求時(shí)候會(huì)捎帶這個(gè)token,我再用同樣的HMAC-SHA256 算法和同樣的密鑰,對(duì)數(shù)據(jù)再計(jì)算一次簽名, 和token中的簽名做個(gè)比較, 如果相同, 我就知道用戶已經(jīng)登錄過了,并且可以直接取到用戶的user id , 如果不相同, 數(shù)據(jù)部分肯定被人篡改過, 我就告訴前端用戶: 對(duì)不起,沒有認(rèn)
Token 中的數(shù)據(jù)是明文保存的(雖然我會(huì)用Base64做下編碼, 但那不是加密), 還是可以被別人看到的, 所以我不能在其中保存像密碼這樣的敏感信息。

當(dāng)然, 如果一個(gè)人的token 被別人偷走了, 那我也沒辦法, 我也會(huì)認(rèn)為小偷就是合法用戶, 這其實(shí)和一個(gè)人的session id 被別人偷走是一樣的。

點(diǎn)我查看更多token相關(guān)信息。
應(yīng)用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表做一對(duì)一關(guān)聯(lián) 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方法只能取一條數(shù)據(jù),如果是多條或者取不到,則會(huì)拋異常user = models.User.objects.filter(name=name, password=password).get()# 通過try方法捕獲異常,如果走到這里說明沒有異常,get方法取到用戶對(duì)象,用戶登錄成功# 登錄成功需要進(jìn)行token表的數(shù)據(jù)保存(這里先假設(shè)token是保存在服務(wù)端數(shù)據(jù)庫中)# 生成一個(gè)衛(wèi)衣的id,使用uuid模塊token = uuid4()# token如果在用戶數(shù)據(jù)庫中存在則更新,沒有的話則創(chuàng)建# 使用update_or_create方法models.Token.objects.update_or_create(user=user, defaults={'token': token})# 將token放入返回的字典中response['token'] = token# 捕獲一個(gè)特別的異常,user對(duì)象如果不存在則會(huì)走此處except ObjectDoesNotExist as e:response['code'] = 101response['msg'] = '用戶名或密碼錯(cuò)誤'# 捕獲其它異常except Exception as e:response['code'] = 102response['msg'] = '未知錯(cuò)誤'# 返回前端數(shù)據(jù)return Response(response)

添加路由:

url(r'^login/', views.Login.as_view()),

二、權(quán)限組件 權(quán)限組件的使用方

法和認(rèn)證組件基本相同:
使用方法:
①寫一個(gè)權(quán)限類,仍然在my_examine.py中:

from rest_framework.permissions import BasePermission # 創(chuàng)建認(rèn)證類,BasePermission class MyPermission(BasePermission):message = '權(quán)限不足,無法查看'# 固定寫一個(gè)has_permission方法用于定義具體權(quán)限內(nèi)容def has_permission(self, request, view):# #因?yàn)闄?quán)限在認(rèn)證之后執(zhí)行的,所有能取到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 = []

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

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

三、頻率組件

回到頂部
使用方法:
①寫一個(gè)頻率類,仍然在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)

要點(diǎn):繼承SimpleRateThrottle,重寫get_cache_key,返回self.get_ident(request),必須配置一個(gè)scop=字符串

② 在settings.py中配置:

REST_FRAMEWORK = {# 一分鐘內(nèi)只能訪問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=[]

總結(jié)

以上是生活随笔為你收集整理的Django框架深入了解_03(DRF之认证组件、权限组件、频率组件、token)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。