(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...