RestFramework之认证组件
一、认证组件的介绍
对于认证,我们一般有三种方式,即cookie, session,token,
- cookie,是将信息存放在客户端(浏览器上),信息不安全;
- session,把信息放在服务器数据库中,但是要是信息量较大,对服务器的压力就会大大增加;
- 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之认证组件的更多相关文章
- rest-framework之认证组件
认证组件 认证简介 作用:校验是否登录 首先定义一个类,集成BaseAuthentication,写一个方法:authenticate,在方法内部,实证过程,认证通过,返回None或者两个对象(use ...
- rest-framework的认证组件
认证组件 1.登录认证(与组件无关): 首先要在model表内添加用户表和token表: from django.db import models # Create your models here. ...
- rest-framework:认证组件
一 认证简介: 只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件 二 局部使用 models.py class Use ...
- Django rest-framework框架-认证组件的简单实例
第一版 : 自己写函数实现用户认证 #models from django.db import models #用户表 class UserInfo(models.Model): user_type_ ...
- rest-framework框架——认证、权限、频率组件
一.rest-framework登录验证 1.models.py添加User和Token模型 class User(models.Model): name = models.CharField(max ...
- Django-restframework 源码之认证组件源码分析
Django-restframework 源码之认证组件源码分析 一 前言 之前在 Django-restframework 的流程分析博客中,把最重要的关于认证.权限和频率的方法找到了.该方法是 A ...
- DRF之认证组件源码解析
认证组件 认证的几种方法:cookie,session,token几种.但是session会使服务器的压力增大,所以我们经常使用的是token.获取唯一的随机字符串: 登陆携带token值的处理: ...
- Django:RestFramework之-------认证
3 restframework-认证 3.1APIView 认证: 认证是否已经登陆,如果已经登陆返回元组,如果没有登陆报错 源码流程: 执行dispatch方法: def dispatch(self ...
- RestFramework之权限组件
一.权限组件的使用 1.首先需要导入包 from rest_framework.permissions import BasePermission 2.编写权限类 class VipPermissio ...
随机推荐
- PAT 甲级 1073 Scientific Notation (20 分) (根据科学计数法写出数)
1073 Scientific Notation (20 分) Scientific notation is the way that scientists easily handle very ...
- python中验证码连通域分割的方法详解
python中验证码连通域分割的方法详解 这篇文章主要给大家介绍了关于python中验证码连通域分割的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需 ...
- Dockerfile构建nginx镜像
Dockerfile构建nginx镜像 [root@bogon ~]# mkdir /opt/docker-file [root@bogon ~]# cd /opt/docker-file/ [roo ...
- VueX(vue状态管理)简单小实例
VueX:状态管理 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 核心模块:State. ...
- idea查看接口及类的关系继承(UML)图
选中接口或类 显示结果: 如果需要添加其他的接口或类:点击右键 添加需要的接口或类: 显示结果:
- [数据库]简单SQL语句总结
1.在查询结果中显示列名:a.用as关键字:select name as '姓名' from students order by ageb.直接表示:select name '姓名' from ...
- Logstash配置安装
logstash配置 http.host: xpack.monitoring.enabled: true xpack.monitoring.elasticsearch.username:"l ...
- nohup 后台运行脚本,且可以实时查看日志
-u加在python上 python命令加上-u(unbuffered)参数后会强制其标准输出也同标准错误一样不通过缓存直接打印到屏幕. 这是因为python的缓存机制所决定的 如果是使用 nohup ...
- SpringBoot中service注入失败(A component required a bean of type 'XXService' that could not found)
先写了JUnit,发现启动不了,注释掉有问题的service也不可以.可能是因为spring开始时会加载所有service吧. 按照网友们的说法,一般需要检查: 1.入口类有没有写MapperScan ...
- MYSQL 八大优化方案
1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设 ...