rest framework的認證元件

2022-03-12 01:17:29 字數 3700 閱讀 9122

首先要在model表內新增使用者表和token表:

from django.db import

models

#create your models here.

class

user(models.model):

name=models.charfield(max_length=32)

pwd=models.charfield(max_length=32)

class

token(models.model):

user=models.onetoonefield("

user

",on_delete=models.cascade)

token=models.charfield(max_length=128)

import

hashlib,time

defget_random_str(user):

ctime=str(time.time())

md5=hashlib.md5(bytes(user,encoding="

utf-8"))

md5.update(bytes(ctime,encoding="

utf-8"))

return

md5.hexdigest()

class

loginview(apiview):

defpost(self,request):

name=request.data.get("

name")

pwd=request.data.get("

pwd"

) user=user.objects.filter(name=name,pwd=pwd).first()

res=

ifuser:

random_str=get_random_str(user.name)

toekn=token.objects.update_or_create(user=user,defaults=)

res[

"token

"]=random_str

else

: res[

"state_code

"]=1001 #

錯誤的狀態碼

res["

msg"]="

使用者名稱密碼錯誤!

"return response(json.dumps(res))

#

author:jesi

#time : 2018/10/6 18:14

from .models import *

from rest_framework.authentication import

baseauthentication

from rest_framework import

exceptions

class

tokenauth(baseauthentication):

defauthenticate(self,request):

'''函式名必須叫authenticate

'''#

驗證條件根據需求設定(此示例為需要有token值)

token=request.get.get("

token")

token_obj=token.objects.filter(token=token).first()

ifnot

token_obj:

#如果驗證失敗,需要跑出authenticationfailed錯誤

raise exceptions.authenticationfailed("

驗證失敗!")

else

:

#如果驗證成功,需要返回乙個元組,分別是使用者以及驗證類的例項物件,然後內部會賦值給request.user和request.auth

return

token_obj.user.name,token_obj.token

defauthenticate_header(self,request):

#加上上面的基礎類繼承,那麼這個header方法就可以不用寫了。

pass

在檢視中只需要加一句就ok了。

class

bookview(apiview):

authentication_classes

= [tokenauth]# 注意,值為乙個列表,可以放多個認證元件類名def

get(self,request):

print(request.user) #

token_obj.user.name

print(request.auth) #

token_obj.token

book_list=book.objects.all()

#bs=bookserializers(book_list,many=true)

bs2=bookmodelserializers(book_list,many=true,context=)

#return response(bs.data)

return response(bs2.data)

這裡列印的2個request.user,request.auth分別就是上面認證類返回的token_obj.user.name和token_obj.token。是乙個元組。

將認證類放到乙個util.py的乙個額外檔案下:

#

author:jesi

#time : 2018/10/6 18:14

from .models import *

from rest_framework.authentication import

baseauthentication

from rest_framework import

exceptions

class

tokenauth(baseauthentication):

defauthenticate(self,request):

token=request.get.get("

token")

token_obj=token.objects.filter(token=token).first()

ifnot

token_obj:

raise exceptions.authenticationfailed("

驗證失敗!")

else

:

return

token_obj.user.name,token_obj.token

defauthenticate_header(self,request):

#加上上面的基礎類繼承,那麼這個header就可以不用寫了。

pass

然後在settings裡面進行乙個配置:

rest_framework=

這樣全域性就都擁有了認證的元件。如果要檢視書籍,作者等操作的時候需要帶上token通過認證類的驗證才可以。

authentication_classes =  #

自己的類裡有的話就呼叫此類的配置,為空既什麼都不做

restframework的許可權

許可權的主要應用比如指定的資料,vip使用者或者付費才能 的,普通使用者不能訪問,我們就可以用許可權元件對其進行限制 許可權的都是發生在認證後面的,所以認證時要返回obj.user,許可權判斷的時候好直接獲取使用者 from rest framework.permissions import bas...

初始Rest Framework的魅力

1.建立序列化器 在應用中新建serializers.py用於儲存該應用的序列化器。class infoserializer serializers.modelserializer 圖書資料序列化器 class meta model info fields all from rest framewo...

rest framework 中的分頁

注意這種寫法不支援api view和api view 配置setting default pagination class 2.建立乙個資料夾mypagenumberpagination class mypagenumberpagination pagenumberpagination page s...