Django-Rest-Framework的版本和认证

DRF的版本

版本控制是做什么用的,我们为什么要用

首先要知道版本是干嘛用的,我们知道开发项目的时候有多个版本

当项目一直更新,版本就越来越多,以前的旧版本就不维护了

那这时,就需要对版本进行控制,这个DRF也给我们提供了一些封装好的版本控制方法

版本控制怎么用

之前视图篇介绍了APIView,也只带APIView返回View中的view函数然后调用的dispach方法

那看一下dispatch方法,看下它都做了些什么

执行self.initial方法之前是各种赋值,包括request的重新封装,下面是路由分发,那我们看这个方法辽做了什么。

可以看到,version版本信息赋值给了request.version 版本控制方案赋值给了request.versioning_scheme

这个版本控制方案就是配置的版本控制的类

也就是说,APIView通过这个方法初始化自己提供的组件

接下来看一下框架提供了那些版本的控制方法  ---- 在rest_framework.versioning

框架一共给我们提供了这几个版本的控制方法,这里只给出一个,其他配置相同

详细用法

第一步 settings.py

 
REST_FRAMEWORK = {
# 默认使用的版本控制类
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
# 允许的版本
'ALLOWED_VERSIONS': ['v1', 'v2'],
# 版本使用的参数名称
'VERSION_PARAM': 'version',
# 默认使用的版本
'DEFAULT_VERSION': 'v1',
}

第二步 urls.py

 
urlpatterns = [
url(r"^versions", MyView.as_view()),
url(r"^(?P<version>[v1|v2]+)/test01", TestView.as_view()),
]

测试视图

 
class TestView(APIView):
def get(self, request, *args, **kwargs):
print(request.versioning_scheme)
ret = request.version
if ret == "v1":
return Response("版本v1的信息")
elif ret == "v2":
return Response("版本v2的信息")
else:
return Response("根本就匹配不到这个路由")

其他版本控制的类,配置方法差不多都一样

DRF的认证

认证是干什么用的

我们都知道,我们可以在网站上登录,然后可以有个人中心,对自己信息进行修改
但是我们每次给服务器发请求,由于Http的无状态,导致我们每次都是新的请求
那么服务端需要对每次来的请求进行认证,看用户是否登录,以及登录用户是谁
那么我们服务器对每个请求进行认证的时候,不可能在每个视图函数中都写认证
一定是把认证逻辑抽离出来,以前我们可能会加装饰器,或者中间件,来看看DRF框架提供了什么

认证怎么用

上面版本控制的时候我们可以知道,在dispatch 方法里,执行了initial方法,那初始化了我们的版本

如果认证读的话,可以看到,版本的下面就是我们的认证,权限,频率组件。

认证组件

我们进去认证看

我们这个权限组件返回的是request.user,那么我们这里的request是新的还是旧的呢

我们的initial是我们request重新赋值之后的,所所以这里的request是新的,也就是Request类实例对象

那这个user一定是一个静态方法,进去一探究竟

这里没有给出反复的跳转截图,自行仔细跳转
通过上面基本可以知道,我们的认证类一定要实现的方法,以及返回值类型,
以及配置的参数authentication_classes

请看具体用法

认证的详细用法

写一个认证demo,先建一张用户表,字段为为用户名以及对应的token值

models.py

 
# 先在model中注册模型类
# 并且进行数据迁移
# 测试我就简写了~ class UserInfo(models.Model):
username = models.CharField(max_length=32)
token = models.UUIDField()

views.py

 
# 写视图类并且用post请求注册一个用户

class UserView(APIView):
def post(self, request, *args, **kwargs):
username = request.data["username"]
UserInfo.objects.create(username=username, token=uuid.uuid4())
return Response("注册成功")

认证开始

写一个认证的类

 
# 注意我们这个认证的类必须实现的方法以及返回值
class MyAuth(BaseAuthentication): def authenticate(self, request):
request_token = request.query_params.get("token", None)
if not request_token:
raise AuthenticationFailed({"code": 1001, "error": "缺少token"})
token_obj = UserInfo.objects.filter(token=request_token).first()
if not token_obj:
raise AuthenticationFailed({"code": 1001, "error": "无效的token"})
return token_obj.username, token_obj

视图级别认证

 
class TestAuthView(APIView):
authentication_classes = [MyAuth, ] def get(self, request, *args, **kwargs):
return Response("测试认证")

全局配置认证

 
REST_FRAMEWORK = {
# 默认使用的版本控制类
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
# 允许的版本
'ALLOWED_VERSIONS': ['v1', 'v2'],
# 版本使用的参数名称
'VERSION_PARAM': 'version',
# 默认使用的版本
'DEFAULT_VERSION': 'v1',
# 配置全局认证
'DEFAULT_AUTHENTICATION_CLASSES': ["BRQP.utils.MyAuth", ]
}

Django-Rest-Framework的版本和认证的更多相关文章

  1. Django Rest framework 之 版本

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  2. Django rest framework(1)----认证

    目录 Django组件库之(一) APIView源码 Django restframework   (1)  ----认证 Django rest framework(2)----权限 Django ...

  3. Django rest framework 之版本

    一.通过 QueryParameterVersioning 获取版本 通过 QueryParameterVersioning 从 get 请求中获取版本信息: 1.新建 app,名为 api,Proj ...

  4. Django REST framework之版本,解释器,序列化

    1 版本 2 解释器 3.序列化 1 版本 通过?后面传版本号有两种方法: 方法一 from django.shortcuts import render from rest_framework.vi ...

  5. Django rest framework源码分析(4)----版本

    版本 新建一个工程Myproject和一个app名为api (1)api/models.py from django.db import models class UserInfo(models.Mo ...

  6. Django rest framework源码分析(1)----认证

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

  7. Django Rest framework 之 认证

    django rest framework 官网 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest fra ...

  8. Django REST framework 之JWT认证

    Json Web Token 1.JWT简介 JWT 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法.JWT 可以使用 H ...

  9. Django rest framework(7)----分页

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

  10. Django rest framework(6)----序列化

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

随机推荐

  1. 算法(Algorithms)第4版 练习 1.3.219

    方法实现: //1.3.19 /** * remove the last node in the linked list whose first node is first * * @return r ...

  2. BZOJ 1193 [HNOI2006]马步距离:大范围贪心 小范围暴搜

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1193 题意: 给定起点(px,py).终点(sx,sy).(x,y < 100000 ...

  3. Servlet_03_部署描述符

    二.参考文档 1.Servlet 3.0 之 部署描述符 2.web.xml配置详解 部署描述符文件

  4. Spring注解实现原理

    ​[Spring如何使用注解机制完成自动装配] Java实例构造时会调用默认父类无参构造方法,Spring正是利用了这一点,让"操作元素的代码"得以执行.   [两种处理策略] ( ...

  5. Linux网络编程socket错误分析

    socket错误码: EINTR: 阻塞的操作被取消阻塞的调用打断.如设置了发送接收超时,就会遇到这种错误. 只能针对阻塞模式的socket.读,写阻塞的socket时,-1返回,错误号为INTR.另 ...

  6. ubuntu c++ 关机 重启 挂起 API

    #include <unistd.h> #include <linux/reboot.h> int main() { reboot(LINUX_REBOOT_MAGIC1, L ...

  7. BZOJ2726:任务安排(DP+斜率优化+二分)

    机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务 ...

  8. LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List

    原题链接在这里:https://leetcode.com/problems/convert-binary-search-tree-to-sorted-doubly-linked-list/ 题目: C ...

  9. 媒体格式分析之flv -- 基于FFMPEG

    本来是应该先写一个媒体文件格式的简单讲解的,还没来得及写,以后再写.今天就先根据ffmpeg的flv.c的flv_demux这个结构体来讲解一下当前比较流行的媒体格式flv. FLV 是FLASH V ...

  10. Linux命令汇总(二)

    1.登录用户设置 新创建了一个用户,用useradd指令,但是发现通过终端无法登陆:  echo password | passwd --stdin username  或者  passwd --st ...