rest_framework组件

认证组件

局部认证

在需要认证的视图类里加上authentication_classes = [认证组件1类名,认证组件2类名....]

示例如下:

seralizers.py

from rest_framework import serializers
from app01 import models

class PublishSerializers(serializers.ModelSerializer):
    class Meta:
        model = models.Publish
        fields = '__all__'

auth.py

from rest_framework.authentication import BaseAuthentication
from rest_framework import exceptions
from app01 import models

class TokenAuth(BaseAuthentication):
    def authenticate(self,request):
        '''函数名必须叫authenticate'''
        # 验证条件根据需求设置(此示例为需要有token值)
        token = request.GET.get('token')
        token_obj = models.Token.objects.filter(token=token).first()
        if not token_obj:
            # 如果验证失败,需要跑出AuthenticationFailed错误
            raise exceptions.AuthenticationFailed("验证失败!")
        else:
            user = token_obj.user
            # 如果验证成功,需要返回一个元组,分别是用户以及验证类的实例对象,然后内部会赋值给request.user和request.auth
            return user.username,token_obj

views.py

from rest_framework import viewsets
from app01.auth import TokenAuth

class PublishViewSet(viewsets.ModelViewSet):
    # 在这里配置authentication_classes
    # 注意,值为一个列表,可以放多个认证组件类名   
    authentication_classes = [TokenAuth]

    queryset = models.Publish.objects.all()
    serializer_class = serializer.PublishSerializers

全局认证

在setting.py里配置如下:

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": ["app01.auth.TokenAuth",]
}

  这样配置之后,每个视图类都要经过认证成功之后才能执行下一步,

如果有某些方法不需要认证,如login函数,则需要在login函数中单独加入一个配置属性:

authentication_classes = [] #自己的类里有的话就调用此类的配置,为空既什么都不做

权限认证

局部认证

permission.py

from app01 import models
class VipPermission():

    def has_permission(self,request,view):
        # 经过认证组件之后将用户名赋值给了request.user
        # 这里可以直接取到
        username = request.user
        user = models.User.objects.filter(username=username).first()
        # 如果用户的vip值为1,即为True,则通过认证,否则return False
        if user.vip:
            return True
        else:
            return False

views.py

from rest_framework import viewsets
from app01.auth import TokenAuth
from app01.permission import VipPermission
class PublishViewSet(viewsets.ModelViewSet):
    authentication_classes = [TokenAuth]
    permission_classes = [VipPermission]

    queryset = models.Publish.objects.all()
    serializer_class = serializer.PublishSerializers

  这个时候如果登录用户是vip,则会继续执行下一步,如果是普通用户,则会返回错误信息,如下:

{"detail":"You do not have permission to perform this action."}

  如果需要自定义错误信息,只需要在类里定义一个message属性即可,如下:

message="只有超级用户才能访问"

全局认证

REST_FRAMEWORK = {
    # 认证组件
    "DEFAULT_AUTHENTICATION_CLASSES": ["app01.auth.TokenAuth",],
    # 权限组件
    "DEFAULT_PERMISSION_CLASSES": ["app01.permission.VipPermission",],
}

频率认证

局部认证

格式如下:

class VisitRateThrottle(object):
    def allow_request(self,request,view):
        # 要求访问站点的频率不能超过每分钟20次等等
        if 1:
            # 如果在限制之内,则返回True

            return True
        else:
            return False

  然后在需要进行限制的视图类中加入如下配置:

throttle_classes = [VisitRateThrottle] 

全局认证

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

java数据库操作 (附带数据库连接池的代码)

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188

2742
来自专栏bboysoul

cheat一个实用 Linux 命令示例集合

在使用linux的时候我们会经常碰到这样的问题,比如使用nmap,我后面到底加什么参数呢?碰到这种情况我们只能使用man或者它的帮助命令来查看使用方法,但是有的...

722
来自专栏用户画像

spring任务调度之scheduler

1. 在使用spring task scheduler 之前,需要先学习搭建springmvc框架,了解cron表达式

804
来自专栏Kevin-ZhangCG

[ Java面试题 ] 框架篇

  1. struts是一个按MVC模式设计的Web层框架,其实它就是一个Servlet,这个Servlet名为ActionServlet,或是ActionSe...

1632
来自专栏Java架构师学习

Java程序员必知的并发编程艺术——并发机制的底层原理实现

Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。 volatile借助Java内存模型...

37011
来自专栏AndroidTv

再写个Gradle脚本干活去,解放双手前言Gradle 脚本

2334
来自专栏积累沉淀

JNDI数据库连接池

JNDI的全称是java命名与目录接口(Java Naming and Directory Interface),是一个应用程序设计的API,为开发人员提供了查...

2355
来自专栏北京马哥教育

浅谈Python Django框架

Python下有多款不同的 Web 框架,Django是最有代表性的一种。许多成功的网站和APP都基于Django。

1132
来自专栏weixuqin 的专栏

使用代理爬取微信文章

3837
来自专栏fixzd

redis系列:基于redis的分布式锁

这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁。会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁。

1122

扫码关注云+社区

领取腾讯云代金券