DDRF的版本
版本控制怎么用
之前我们学视图的时候知道APIView,也知道APIView返回View中的view函数,然后调用的dispatch方法~
我们现在看下dispatch方法~~做了什么

执行self.initial方法之前是各种赋值,包括request的重新封装赋值,下面是路由的分发,下图是initial的源码:

在rest_framework.versioning中我们能看到框架提供了那些版本的控制方法

详细用法
URL上携带版本信息的配置
第一步 settings.py
REST_FRAMEWORK = {
# 默认使用的版本控制类
'DEFAULT_VERSIONING_CLASS': 'utils.version.MyVersion',
# 允许的版本
'DEFAULT_VERSION': None,
# 版本使用的参数名称
'ALLOWED_VERSIONS': None,
# 默认使用的版本
'VERSION_PARAM': 'version'
}
第二步 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的认证
认证怎么用
认证组件

点认证组件方法进去看一下:

我们这个权限组件返回的是request.user,这里的request是initial方法重新赋值后的,所以是新的~也就是Request类实例化对象
点user进去看看:


通过上面基本可以知道我们的认证类一定要实现的方法~~以及返回值类型~~以及配置的参数authentication_classes
认证的详细用法
我们先写个认证的小demo~~我们先建一个用户表~字段为用户名以及对应的token值~
models.py
rom django.db import models
# Create your models here.
class User(models.Model):
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
token = models.UUIDField(null=True, blank=True)
views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import User
import uuid
from .auth import MyAuth
# Create your views here.
class LoginView(APIView):
def post(self, request):
name = request.data.get('name', '')
pwd = request.data.get('pwd', '')
# 校验用户名和密码是否正确
user_obj = User.objects.filter(name=name, pwd=pwd).first()
if user_obj:
user_obj.token = uuid.uuid4()
user_obj.save()
return Response(user_obj.token)
else:
return Response('用户名或密码错误')
接下来正式认证:
写一个认证的类
# 注意我们这个认证的类必须实现的方法以及返回值
from .models import User
from rest_framework.exceptions import AuthenticationFailed
from rest_framework.authentication import BaseAuthentication
class MyAuth(BaseAuthentication):
def authenticate(self, request):
# 认证逻辑
# 拿到前端传过来的token
# 判断token是否存在
# query_params是我们常用的GET请求
token = request.query_params.get('token', '')
if not token:
raise AuthenticationFailed('缺少token')
user_obj = User.objects.filter(token=token).first()
if not user_obj:
raise AuthenticationFailed('token不合法')
# request.user request.auth
return (user_obj, token)
视图级别认证
class TestView(APIView):
# 把自定义的类传递过来
authentication_classes = [MyAuth, ]
def get(self, request):
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", ]
}