python學習第九十八天:認證組件權限組件與頻率組件
阿新 • • 發佈:2018-10-23
fir setting fun python學習 .data onetoone 超級 .com params
認證組件
認證簡介
只有認證通過的用戶才能訪問指定的url地址,比如:查詢課程信息,需要登錄之後才能查看,沒有登錄,就不能查看,這時候需要用到認證組件
組件的使用
(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={‘status‘:1001,‘msg‘:None}
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={‘token‘:token})
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)
class Course(APIView):
authentication_classes = [TokenAuth, ]
def get(self, request):
return HttpResponse(‘get‘)
def post(self, request):
return HttpResponse(‘post‘)
全局使用
在setting中
REST_FRAMEWORK={
"DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",]
}
局部使用
在views需要認證的類中
authentication_classes = [TokenAuth, ]
權限組件
與認證類似
1 寫一個類
class MyPermission():
def has_permission(self,request,view):
token=request.query_params.get(‘token‘)
ret=models.UserToken.objects.filter(token=token).first()
if ret.user.type==2:
# 超級用戶可以訪問
return True
else:
return False
2 局部使用:
permission_classes=[MyPermission,]
3 全局使用:
REST_FRAMEWORK={
‘DEFAULT_PERMISSION_CLASSES‘:[‘utils.common.MyPermission‘,]
}
頻率組件
與認證類似
1 寫一個類:
from rest_framework.throttling import SimpleRateThrottle
class VisitThrottle(SimpleRateThrottle):
scope = ‘xxx‘
def get_cache_key(self, request, view):
return self.get_ident(request)
2 在setting裏配置:
‘DEFAULT_THROTTLE_RATES‘:{
‘xxx‘:‘5/h‘,
}
3 局部使用
throttle_classes=[VisitThrottle,]
4 全局使用
REST_FRAMEWORK={
‘DEFAULT_THROTTLE_CLASSES‘:[‘utils.common.MyPermission‘,]
}
python學習第九十八天:認證組件權限組件與頻率組件