认证组件

1.登录认证(与组件无关):

首先要在model表内添加用户表和token表:

from django.db import models

# Create your models here.
class User(models.Model):
name=models.CharField(max_length=32)
pwd=models.CharField(max_length=32) class Token(models.Model):
user=models.OneToOneField("User",on_delete=models.CASCADE)
token=models.CharField(max_length=128)
import hashlib,time
def get_random_str(user):
ctime=str(time.time())
md5=hashlib.md5(bytes(user,encoding="utf-8"))
md5.update(bytes(ctime,encoding="utf-8")) return md5.hexdigest() class LoginView(APIView):
def post(self,request):
name=request.data.get("name")
pwd=request.data.get("pwd")
user=User.objects.filter(name=name,pwd=pwd).first()
res={"state_code":1000,"msg":None}
if user:
random_str=get_random_str(user.name)
toekn=Token.objects.update_or_create(user=user,defaults={"token":random_str})
res["token"]=random_str
else:
res["state_code"]=1001 #错误的状态码
res["msg"]="用户名密码错误!" return Response(json.dumps(res))

2.局部认证:

# Author:Jesi
# Time : 2018/10/6 18:14
from .models import *
from rest_framework.authentication import BaseAuthentication from rest_framework import exceptions
class TokenAuth(BaseAuthentication):
def authenticate(self,request):
'''函数名必须叫authenticate'''
# 验证条件根据需求设置(此示例为需要有token值)
token=request.GET.get("token")
token_obj=Token.objects.filter(token=token).first()
if not token_obj:
# 如果验证失败,需要跑出AuthenticationFailed错误
raise exceptions.AuthenticationFailed("验证失败!")
else:
# 如果验证成功,需要返回一个元组,分别是用户以及验证类的实例对象,然后内部会赋值给request.user和request.auth
return token_obj.user.name,token_obj.token def authenticate_header(self,request):
#加上上面的基础类继承,那么这个header方法就可以不用写了。
pass

在视图中只需要加一句就OK了。

class BookView(APIView):
authentication_classes = [TokenAuth]  # 注意,值为一个列表,可以放多个认证组件类名 
def get(self,request):
print(request.user) #token_obj.user.name
print(request.auth) #token_obj.token
book_list=Book.objects.all()
# bs=BookSerializers(book_list,many=True)
bs2=BookModelSerializers(book_list,many=True,context={'request': request})
# return Response(bs.data)
return Response(bs2.data)

这里打印的2个request.user,request.auth分别就是上面认证类返回的token_obj.user.name和token_obj.token。是一个元组。

3.全局配置:

将认证类放到一个util.py的一个额外文件下:

# Author:Jesi
# Time : 2018/10/6 18:14
from .models import *
from rest_framework.authentication import BaseAuthentication from rest_framework import exceptions
class TokenAuth(BaseAuthentication):
def authenticate(self,request):
token=request.GET.get("token")
token_obj=Token.objects.filter(token=token).first()
if not token_obj:
raise exceptions.AuthenticationFailed("验证失败!")
else:
return token_obj.user.name,token_obj.token def authenticate_header(self,request):
#加上上面的基础类继承,那么这个header就可以不用写了。
pass

然后在settings里面进行一个配置:

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

这样全局就都拥有了认证的组件。如果要查看书籍,作者等操作的时候需要带上token通过认证类的验证才可以。

http://127.0.0.1:8000/books/?token=7f9038f36213a9e6aa6c3ad51043d9d0

最后:

这样配置之后,每个视图类都要经过认证成功之后才能执行下一步,如果有某些方法不需要认证,如login函数,则需要在login函数中单独加入一个配置属性:

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

rest-framework的认证组件的更多相关文章

  1. restful framework之认证组件

    一.认证介绍 只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件 二.局部使用 (1)models层: class Us ...

  2. DRF Django REST framework 之 认证组件(五)

    引言 很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记录任 ...

  3. Django REST Framework之认证组件

    什么是认证 认证即需要知道是谁在访问服务器,需要有一个合法身份.认证的方式可以有很多种,例如session+cookie.token等,这里以token为例.如果请求中没有token,我们认为这是未登 ...

  4. 基于django rest framework做认证组件

    先导入要用到的类 from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions ...

  5. rest framework认证组件和django自带csrf组件区别详解

    使用 Django 中的 csrf 处理 Django中有一个django.middleware.csrf.CsrfViewMiddleware中间件提供了全局的csrf检查.它的原理是在<fo ...

  6. Django高级篇三。restful的解析器,认证组件,权限组件

    一.rest=framework之解析器 1)解析器作用. 根据提交的数据.只解析某些特定的数据.非法数据不接收,为了系统安全问题 比如解析的数据格式有 有application/json,x-www ...

  7. 基于Django的Rest Framework框架的认证组件

    0|1一.认证组件的作用 在一个程序中有一些功能是需要登录才能使用的,原生Django中的auth组件可以用来解决这个认证问题,drf框架中也有对应的认证组件来解决这个问题. models.py   ...

  8. django rest framework 认证组件

    1.认证组件 1.认证组件 1.认证组件 1.认证组件

  9. Django REST framework —— 认证组件源码分析

    我在前面的博客里已经讲过了,我们一般编写API的时候用的方式 class CoursesView(ViewSetMixin,APIView): pass 这种方式的有点是,灵活性比较大,可以根据自己的 ...

  10. Django-rest framework框架的三大认证组件

    源码分析:三大认证组件的封装 组件的认证配置: 模型层:models.py class User(BaseModel): username = models.CharField(verbose_nam ...

随机推荐

  1. SMB协议原理抓包分析

    SMB协议原理抓包分析 目录: 1.SMB概述 2.SMB原理 3.SMB配置 一.SMB概述 SMB(全称是Server Message Block)是一个协议名,可用于在计算机间共享文件.打印机. ...

  2. Python爬虫之Urllib库的基本使用

    # get请求 import urllib.request response = urllib.request.urlopen("http://www.baidu.com") pr ...

  3. Ajax的一个实例及代码

    这是用ajax做的一个小小的应用!当选择menu1的时候,会出来menu里面所有的内容.同理对于menu2.多的不说,代码如下: 首先是inner.html文件 <html><hea ...

  4. 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(一)转载自码农网

    CentOS 是一个工业标准的 Linux 发行版,是红帽企业版 Linux 的衍生版本.你安装完后马上就可以使用,但是为了更好地使用你的系统,你需要进行一些升级.安装新的软件包.配置特定服务和应用程 ...

  5. 如何学习sss和前端数据处理

    1.学习scss,就看这篇:http://www.ruanyifeng.com/blog/2012/06/sass.html 就够了,因为sass的出现本来就是为了简化工作提高效率,也不算什么深奥精妙 ...

  6. Loj 3058. 「HNOI2019」白兔之舞

    Loj 3058. 「HNOI2019」白兔之舞 题目描述 有一张顶点数为 \((L+1)\times n\) 的有向图.这张图的每个顶点由一个二元组 \((u,v)\) 表示 \((0\le u\l ...

  7. docker 14 dockerfile自定义mycentos

    Base镜像(scratch) Docker Hub中99%的镜像是通过在base镜像中安装和配置需要的软件构建出来的.也就是说base镜像是所有其他镜像的鼻祖. hub默认centos镜像是什么情况 ...

  8. Feature Extractor[SENet]

    0.背景 这个模型是<Deep Learning高质量>群里的牛津大神Weidi Xie在介绍他们的VGG face2时候,看到对应的论文<VGGFace2: A dataset f ...

  9. leetcode:Single Number

    public int SingleNumber(int[] nums) { if(nums==null||nums.Length%2==0) return 0; int ret=nums[0]; fo ...

  10. VBS弹出来的对话框如何置顶!--果然技巧

    msgbox 第二参数+4096 mshta vbscript:msgbox("提示内容6",6,"提示窗口6")(window.close)