码迷,mamicode.com
首页 > 其他好文 > 详细

RESTful-rest_framework认证组件、权限组件、频率组件-第五篇

时间:2018-10-22 22:15:04      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:null   choice   认证通过   models   地址   rto   div   int   xxx   

 

认证组件格式:

1 写一个认证类
        from rest_framework.authentication import BaseAuthentication
        class MyAuth(BaseAuthentication):
            def authenticate(self,request):
        #         request  是封装后的
                token = request.query_params.get(token)
                ret = models.UserToken.objects.filter(token=token).first()
                if ret:
        #             认证通过
                    return
                else:
                    raise AuthenticationFailed(认证失败)
            #可以不写了
            def authenticate_header(self,ss):
                pass
    2 局部使用
        authentication_classes=[MyAuth,MyAuth2]
    3 全局使用
        查找顺序:自定义的APIView里找---》项目settings里找---》内置默认的
        REST_FRAMEWORK={
            DEFAULT_AUTHENTICATION_CLASSES:[utils.common.MyAuth,]

        }

 

权限组件格式:

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,]
        }

 

实例

实例简介:

只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件

技术分享图片

 

1.mode层

class UserInfo(models.Model):
    name=models.CharField(max_length=32)
    pwd=models.CharField(max_length=32)
    ss=((1,超级用户),(2,普通用户),(3,二逼用户))
    type=models.IntegerField(choices=ss,null=True)

class UserToken(models.Model):
    user=models.OneToOneField(to=UserInfo)
    token=models.CharField(max_length=64)

 

2.views层

from django.shortcuts import render,HttpResponse

# Create your views here.

import json
from rest_framework.views import APIView
from app01 import models
from utils.common import *
from rest_framework.response import Response

#登录类
class Login(APIView):
    def post(self,request,*args,**kwargs):

        #实例化响应状态函数(添加登录成功后的状态信息)
        response=MyResponse()

        #判断用户名、密码是否正确
        name=request.data.get(name)
        pwd=request.data.get(pwd)
        user=models.UserInfo.objects.filter(name=name,pwd=pwd).first()

        #如果登录成功生成一个随机字符串
        if user:
            #生成一个随机字符串
            token=get_token(name)
            #token表里面的信息,如果不存在,会创建,如果存在会更新token值(因为进行了随机时间加盐),使用的是update_or_create
            ret=models.UserToken.objects.update_or_create(user=user,defaults={token:token})
            # ret=models.UserInfo.objects.update_or_create(id=1,defaults={‘token‘:token}) 不是只能写user或者可以写id

            response.status=100
            response.msg=登录成功
            response.token=token
            print(response.get_dic())
        else:
            response.msg="用户名密码错误"
            # response.data=‘ddd‘  最后response.get_dic(),都可以把这些信息返回

        #里面需要传入个字典
        return Response(response.get_dic())


#查看课程类
class Course(APIView):
    #局部登录认证
    authentication_classes = [MyAuth,]
    #局部权限认证
    permission_classes = [Mypermission,]
    #局部频率认证
    throttle_classes = [VisitThrottle,]
    def get(self,request):
        print(request.user)
        print(request.auth)
        return HttpResponse(json.dumps({name:python}))

 

 

 

2.新建认证类

from rest_framework.exceptions import APIException,AuthenticationFailed
class MyAuth(BaseAuthentication):
    def authenticate(self, request):
        #拿到的是随机token的值
        token = request.query_params.get(token)
        ret = models.UserToken.objects.filter(token=token).first()
        if ret:
            #认证通过
            return ret.user,ret
        else:
            #认证失败
            raise AuthenticationFailed(认证失败)

 

RESTful-rest_framework认证组件、权限组件、频率组件-第五篇

标签:null   choice   认证通过   models   地址   rto   div   int   xxx   

原文地址:https://www.cnblogs.com/yangzhizong/p/9833245.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!