rest framework之認證元件

2021-09-24 22:56:05 字數 4998 閱讀 6859

(1)models層:

class 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')

token=models.charfield(max_length=64)

(2)新建認證類(驗證通過return兩個引數)

from rest_framework.authentication import baseauthentication

class tokenauth():

def authenticate(self, request):

token = request.get.get('token')

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

if token_obj:

return

else:

raise authenticationfailed('認證失敗')

def authenticate_header(self,request):

pass

(3)view層

def get_random(name):

import hashlib

import time

md=hashlib.md5()

md.update(bytes(str(time.time()),encoding='utf-8'))

md.update(bytes(name,encoding='utf-8'))

return md.hexdigest()

class login(apiview):

def post(self,reuquest):

back_msg=

try:

name=reuquest.data.get('name')

pwd=reuquest.data.get('pwd')

user=models.user.objects.filter(username=name,password=pwd).first()

if user:

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'] = '使用者名稱或密碼錯誤'

return httpresponse('post')

附:不存資料庫的token驗證

def get_token(id,salt='123'):

import hashlib

md=hashlib.md5()

md.update(bytes(str(id),encoding='utf-8'))

md.update(bytes(salt,encoding='utf-8'))

return md.hexdigest()+'|'+str(id)

def check_token(token,salt='123'):

ll=token.split('|')

import hashlib

md=hashlib.md5()

md.update(bytes(ll[-1],encoding='utf-8'))

md.update(bytes(salt,encoding='utf-8'))

if ll[0]==md.hexdigest():

return true

else:

return false

class tokenauth():

def authenticate(self, request):

token = request.get.get('token')

success=check_token(token)

if success:

return

else:

raise authenticationfailed('認證失敗')

def authenticate_header(self,request):

pass

class login(apiview):

def post(self,reuquest):

back_msg=

try:

name=reuquest.data.get('name')

pwd=reuquest.data.get('pwd')

user=models.user.objects.filter(username=name,password=pwd).first()

if user:

token=get_token(user.pk)

# 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)

from rest_framework.authentication import baseauthentication

class tokenauth():

def authenticate(self, request):

token = request.get.get('token')

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

if token_obj:

return

else:

raise authenticationfailed('認證失敗')

return httpresponse('post')

總結:區域性使用,只需要在檢視類裡加入:

authentication_classes = [tokenauth, ]
rest_framework=
複製**

#request物件的user方法

@property

def user(self):

the authentication classes provided to the request.

if not hasattr(self, '_user'):

with wrap_attributeerrors():

self._authenticate()

return self._user

def _authenticate(self):

for authenticator in self.authenticators:

try:

user_auth_tuple = authenticator.authenticate(self)

except exceptions.apiexception:

self._not_authenticated()

raise

#認證成功,可以返回乙個元組,但必須是最後乙個驗證類才能返回

if user_auth_tuple is not none:

self._authenticator = authenticator

self.user, self.auth = user_auth_tuple

return

self._not_authenticated()

self.authenticators

def get_authenticators(self):

return [auth() for auth in self.authentication_classes]

認證類使用順序:先用檢視類中的驗證類,再用settings裡配置的驗證類,最後用預設的驗證類

rest framework之版本控制

api版本控制可以用來在不同的客戶端使用不同的行為。rest框架提供了大量不同的版本設計。版本控制是由傳入的客戶端請求決定的,並且可能基於請求url,或者基於請求頭。有許多有效的方法達到版本控制的目的。特別是為具有多個客戶的長期系統工程進行設計時,沒有版本控制的系統也是可以的。當使用版本控制時,re...

REST framework之許可權元件

例如只用超級使用者才能訪問指定的資料,普通使用者不能訪問,所以就要有許可權元件對其限制 from rest framework.permissions import basepermission class userpermission basepermission message 不是超級使用者,...

rest framework 之版本控制

用於版本的控制 from rest framework.versioning import queryparameterversioning,acceptheaderversioning,namespaceversioning,urlpathversioning 基於url的get傳參方式 quer...