一、认证组件的介绍

  对于认证,我们一般有三种方式,即cookie, session,token,

  1. cookie,是将信息存放在客户端(浏览器上),信息不安全;
  2. session,把信息放在服务器数据库中,但是要是信息量较大,对服务器的压力就会大大增加;
  3. token采用每次用户登陆后为其设置一个随机字符串,即token值,用户登陆之后,每次访问都带着这个token来访问,服务端只需要验证token值是否正确就可以,相对比较方便使用;

  所以,我们使用token做认证;

二、认证组件的使用

  首先需要编写模型类这里已经准备好了,主要是需要user表与token表。

class User(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
level = (
(1, 'delux'),
(2, 'vip'),
(3, 'svip')
)
user_level = models.IntegerField(choices=level) class UserToken(models.Model):
token = models.CharField(max_length=128)
user = models.OneToOneField('User', on_delete=models.CASCADE)

  然后需要编写登陆视图

class Loginview(APIView):
# parser_classes = [JSONParser, FormParser]
def get(self, request):
return render(request, 'login.html') def post(self, request):
'''
code:
200:登陆成功
201:用户名或密码错误
202:其他错误
:param request:
:return:
'''
res = {'code': None, 'user': None, 'message': None}
try:
username = request.data.get('username')
password = request.data.get('password')
user_obj = User.objects.filter(username=username, password=password).first()
if user_obj:
token_str = str(uuid.uuid4()).replace('-', '')
UserToken.objects.update_or_create(user=user_obj, defaults={'token': token_str})
res['code'] = ''
res['user'] = username
res['message'] = '登陆成功'
res['token'] = token_str
else:
res['code'] = ''
res['message'] = '用户名或密码错误'
except Exception as e:
res['code'] = ''
res['message'] = e
# print(request.data)
# print(self.parser_classes)
# res['succsess'] = request.data
# res = json.dumps(res)
return Response(res)

  准备工作做好之后我们来编写认证类,在编写之前需要导入相关的包与模型类

from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from app01.models import UserToken     # model中的模型类

  开始编写认证类,

class UserAuth(BaseAuthentication):
def authenticate(self, request):
# 我们模仿get请求页面
token = request.query_params.get("token") # 同request.GET.get("token")
# 在token表中查找有么有这次请求携带的token值
user_token_obj = models.UserToken.objects.filter(token=token).first()
if user_token_obj:
# 如果有值,说明是 正常用户
return user_token_obj.user, user_token_obj.token
# 返回 当前的用户对象,和当前的token值,这样源码就会帮我们赋值给request对象了,我们在后面的request中就可以使用了
else:
raise AuthenticationFailed("认证失败!")

  视图类中只需要加入一行代码

authentication_classes = [UserAuth]  # 认证类

  这样我们的认证组件就完成了。

  

RestFramework之认证组件的更多相关文章

  1. rest-framework之认证组件

    认证组件 认证简介 作用:校验是否登录 首先定义一个类,集成BaseAuthentication,写一个方法:authenticate,在方法内部,实证过程,认证通过,返回None或者两个对象(use ...

  2. rest-framework的认证组件

    认证组件 1.登录认证(与组件无关): 首先要在model表内添加用户表和token表: from django.db import models # Create your models here. ...

  3. rest-framework:认证组件

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

  4. Django rest-framework框架-认证组件的简单实例

    第一版 : 自己写函数实现用户认证 #models from django.db import models #用户表 class UserInfo(models.Model): user_type_ ...

  5. rest-framework框架——认证、权限、频率组件

    一.rest-framework登录验证 1.models.py添加User和Token模型 class User(models.Model): name = models.CharField(max ...

  6. Django-restframework 源码之认证组件源码分析

    Django-restframework 源码之认证组件源码分析 一 前言 之前在 Django-restframework 的流程分析博客中,把最重要的关于认证.权限和频率的方法找到了.该方法是 A ...

  7. DRF之认证组件源码解析

    认证组件  认证的几种方法:cookie,session,token几种.但是session会使服务器的压力增大,所以我们经常使用的是token.获取唯一的随机字符串: 登陆携带token值的处理: ...

  8. Django:RestFramework之-------认证

    3 restframework-认证 3.1APIView 认证: 认证是否已经登陆,如果已经登陆返回元组,如果没有登陆报错 源码流程: 执行dispatch方法: def dispatch(self ...

  9. RestFramework之权限组件

    一.权限组件的使用 1.首先需要导入包 from rest_framework.permissions import BasePermission 2.编写权限类 class VipPermissio ...

随机推荐

  1. Apache Flink 开发环境搭建和应用的配置、部署及运行

    https://mp.weixin.qq.com/s/noD2Jv6m-somEMtjWTJh3w 本文是根据 Apache Flink 系列直播课程整理而成,由阿里巴巴高级开发工程师沙晟阳分享,主要 ...

  2. intellij tomcat配置

    目录 intellij tomcat配置 @(目录) intellij tomcat配置 如上图标注 1 所示,我们可以切换随时为项目切换不同的容器. 如上图标注 2 所示,我们可以指定给运行的容器设 ...

  3. 小程序报错 thirdScriptError

    thirdScriptError sdk uncaught third Error Unexpected token export SyntaxError: Unexpected token expo ...

  4. 【计算机视觉】OpenCV篇(5) - 仿射变换与透视变换

    参考: 图像处理的仿射变换与透视变换(https://www.imooc.com/article/27535) http://ex2tron.wang/opencv-python-extra-warp ...

  5. EXCEL 调整日期格式

    https://jingyan.baidu.com/article/647f0115ea31b67f2048a85a.html 先中数据(不带标题),点击菜单-数据-分列. 前2步不要做任何更改直接点 ...

  6. 【GStreamer开发】GStreamer播放教程01——playbin2的使用

    目标 我们前面已经使用过了playbin2这个element,它可以让我们做的很少而实现很多.本教程会展示当这个element的默认设置在一些特殊情形下不符合我们的需求是可以做的一些深度定制,我们会看 ...

  7. matlab绘制直方图的方法

    直接上代码,利用hist绘制频次直方图和频率直方图... %rand Fs=1000;N=10000; t=0:1/Fs:(N-1)/Fs; X1=rand(1,length(t)); subplot ...

  8. ipv6 地址说明

    开篇我们先简单介绍下ipv4 地址 IPv4 地址: ipv4地址一共32位,用点分十进制表示,每一个部分是8位.子网掩码有两种表示 192.168.1.3 / 24 表示ip的前24位是网络位,后8 ...

  9. ROS安装,配置

    ROS最好安装在Ubuntu系统,因为ROS目前在其他的系统中都是试验性的 ! <Learning ROS for Robotics Programming-- second Edition&g ...

  10. [转帖]深度分析HBase架构

    深度分析HBase架构 https://zhuanlan.zhihu.com/p/30414252   原文链接(https://mapr.com/blog/in-depth-look-hbase-a ...