rest_framework認證元件主要就是用來做登陸校驗
使用第一步建表
classtoken是什麼?user(models.model):
username=models.charfield(max_length=32)
password=models.charfield(max_length=32)
user_type=models.integerfield(choices=((1,'
超級使用者
'),(2,'
普通使用者
'),(3,'
二筆使用者
')))
class
usertoken(models.model):
user=models.onetoonefield(to='
user
')###onetoonefield()實質是foreignkey(unique=true)token=models.charfield(max_length=64)
我們之前做驗證登入的時候,只要使用者端登入成功,服務端就生成乙個session(就是乙個隨機字串)自己儲存起來,再把這個字串返回給客戶端,客戶端把這個字串存起來稱為cookie,下次客戶端做其他需要登入的操作時只需要把cookie傳給服務端和session做比對,只要對的上就是已登陸。(cookie和session都是那個隨機字串,只是在客戶端的時候把這個字串稱為cookie,服務端的時候稱為session)
但是這麼做有個缺點,如果訪問伺服器的客戶很多, 有成千上萬個,甚至幾十萬個,客戶端只需要儲存自己的cookie就可以了,而服務端就需要儲存所有的session,這對伺服器說是乙個巨大的開銷 , 嚴重的限制了伺服器擴充套件能力。所以有什麼辦法能讓服務端不儲存session同樣能完成校驗呢?有,就是token
我們在服務端儲存乙個秘密字串,每次使用者登入後返回給客戶端的字串就由:使用者的賬號+使用者的密碼+秘密字串用演算法(比如hmac-sha256 演算法)生成,之後使用者做其他操作把這個字串發給服務端時服務端只需要再用演算法解開,就可以拿到賬號密碼和那個秘密字串,然後就可以做對比了
ps:秘密字串就是他們說的金鑰 ,使用者的賬號+使用者的密碼+金鑰用演算法生成的字串就稱為token
第二步,寫乙個認證類(繼承baseauthentication)
from rest_framework.authentication import第三步,寫登入介面和需要登入驗證的介面baseauthentication
from rest_framework.exceptions import
authenticationfailed
class
tokenauth(baseauthentication):
defauthenticate(self, request):
print('
一定會走我')
token = request.get.get('
token
')#用的是request.get所以前端提交token時要在**裡拼?token=.....
token_obj = models.usertoken.objects.filter(token=token).first()
iftoken_obj:
return
else
:
raise authenticationfailed('
認證失敗')
登入介面
from rest_framework.response import需要登入驗證的介面response
from rest_framework.views import
apiview
class
login(apiview):
defget(self,request):
return render(request,'
login.html')
defpost(self,request):
back_msg=
(request.data)
try:
name=request.data.get('
username')
password=request.data.get('
password')
user=models.user.objects.filter(username=name,password=password).first()
ifuser:
token=get_random(name)
models.usertoken.objects.update_or_create(user=user,defaults=)
back_msg[
'status
']='
1000
'back_msg[
'msg
']='
登入成功
'back_msg[
'token
']=token
else
: back_msg[
'msg
'] = '
使用者名稱或密碼錯誤
'except
exception as e:
back_msg[
'msg
']=str(e)
return response(back_msg)
classpostman試驗:authtest(apiview):
authentication_classes =[tokenauth, ]#只要在需要認證的類下面加上authentication_classes =[tokenauth, ]就可以了
#tokenauth就是前面的認證類,裡面可以放多個認證類;
defget(self, request):
return response('
get請求驗證成功')
defpost(self, request):
return response('
post請求驗證成功
')
因為前面寫的是request.get所以需要在**裡拼?token=....,
只要改成request.data就可以在body裡面輸入token
同樣的想要把token寫在header裡就需要用request.mata
rest framework登入認證
class user models.model user models.charfield max length 32 pwd models.charfield max length 32 class usertoken models.model token models.charfield max...
REST framework 五 認證元件
rest framework 的認證元件是在 apiview dispatch下執行的。跟著原始碼過了下,了解它的實現過程。上圖源 中的self.authenticators就是乙個認證元件類的乙個列表,我們在接下來後面的自定義認證元件時,就要注意這裡面的源代源內容,自定義類的類名可以自己起,而類中...
rest framework之認證元件
1 models層 class user models.model username models.charfield max length 32 password models.charfield max length 32 user type models.integerfield choice...