drf路由与认证
一、路由
三种路由配置
1 没有继承视图集的视图类
# urls.py
path('books4/', views.Book4View.as_view()),
re_path('books4/(?P<pk>\d+)', views.Book4DetailView.as_view())
2 继承了视图集的视图类
# urls.py
path('books5/', views.Book5View.as_view(actions={'get':'list','post':'create'})), #当路径匹配,又是get请求,会执行Book5View的list方法
re_path('books5/(?P<pk>\d+)', views.Book5View.as_view(actions={'get':'retrieve','put':'update','delete':'destroy'})),
# 这里的方法名可以修改
3 继承自ModelViewSet的路由写法(自动生成)
# 1
# 导入routers类
from rest_framework import routers
# 2
# 实例化得到routers对象
# 这种比下面simple多几个没用的路由
# router = routers.DefaultRouter()
# 只有两个路由,一个是带pk参数,一个不带参数
# ^student4/$ [name='student-list'] student4/
# ^student4/(?P<pk>[^/.]+)/$ [name='student-detail'] student4/4/
router = routers.SimpleRouter()
# 3
# 注册 router.register('前缀','继承自ModelViewSet视图类','别名')
router.register('student4',views.Students4API)
# 4
urlpatterns+=router.urls
action参数
# 当我们需要自定义方法名也能自动生成路由的时候
from rest_framework.decorators import action
# methods:放一个需要对于的请求列表
# detail=True 带pk参数,False 不带pk参数
@action(methods=['GET'],detail=True)
def get_xxx(self,request,pk):
return Response({'pk':pk})
二、认证
1 drf认证的源码分析
# 分析APIView重写的dispatch方法,发现它添加了一个initial方法,这个方法内涵了drf的三大校验:认证,权限,频率
# 点进去这个方法,删掉没用的,发现最后就调用了这三个方法,第一个是认证的方法
def initial(self, request, *args, **kwargs):
self.perform_authentication(request)
self.check_permissions(request)
self.check_throttles(request)
# perform_authentication内部只有一个代码就是request.user
# 这里要注意,APIView重写了request,所以这里看到的request实际上是drf写的
# 所以我们在找user的时候要去drf的Request类中
# 最后发现user原来是一个被封装成属性的方法
@property
def user(self):
# 如果request没有_user属性,执行self._authenticate()
# 到Request的__init__方法看,果然没有
if not hasattr(self, '_user'):
with wrap_attributeerrors():
self._authenticate()
return self._user
# 最后我们点到_authenticate()方法,再展开这个方法前,我们需要找到其中最关键的参数authenticators
# 先去实例化的对象里,也就是dispatch内定义的request找
# 是通过一个initialize_request方法实例化了request
# 在这里发现了我们要找的authenticators
# 是调用了get_authenticators得到的
# 内部返回了一个[auth() for auth in self.authentication_classes]
# 这是一个列表生成式,循环self.authentication_classes,对象内没有这个属性,去Request类中找
# 发现他的来源是api_settings.xxx
# 这里就不再展开了,只要知道这是一个配置的常量,内部是一个列表,存放着我们要认证的类
# 查找顺序是先从视图类(局部),其次项目settings(全局),最后apisettings(默认)
# 只要在一个地方配置了,就会向下覆盖
# 再回到这个列表生成式,是调用了存放在列表中的认证类,在把实例化的对象放入新的列表authenticators
def _authenticate(self):
# 循环拿到的是一个个认证对象
for authenticator in self.authenticators:
try:
# 调用了认证对象的authenticate,把request传进去
user_auth_tuple = authenticator.authenticate(self)
except exceptions.APIException:
# 如果没有这个方法,就会抛异常,所以从这里可以知道,如果要自定义认证类,就必须重写类中的authenticate方法
# 并按固定格式返回数据
self._not_authenticated()
raise
# 把返回的参数赋值给request,第一个参数默认必须是用户,第二个随便
if user_auth_tuple is not None:
self._authenticator = authenticator
self.user, self.auth = user_auth_tuple
return
# 如果返回值user_auth_tuple为空,代表认证通过,但是没有登陆用户与登陆认证信息,代表游客
self._not_authenticated()
2 自定义认证类的使用
# 自定义认证类
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
class TokenAuthentication(BaseAuthentication):
def authenticate(self,request):
token = request.GET.get('token')
username = request.GET.get('username')
obj = UserToken.objects.filter(token=token)
user = User.objects.filter(username=username).first()
if obj:
return user,obj
else:
raise AuthenticationFailed('认证失败')
view.py
class Students2API(GenericAPIView,ListModelMixin,CreateModelMixin):
queryset = models.Student.objects
serializer_class = ser.StudentModelSerializer
authentication_classes = [TokenAuthentication]
# 局部配置
def get(self,request):
return self.list(request)
def post(self,request):
return self.create(request)
class Student2API(GenericAPIView,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin):
queryset = models.Student.objects
serializer_class = ser.StudentModelSerializer
def put(self,request,pk):
return self.update(request,pk)
def get(self,request,pk):
return self.retrieve(request,pk)
def delete(self,request,pk):
return self.destroy(request,pk)
class UserAPI(APIView):
# 登录视图
def post(self,request):
username = request.data.get('username')
password = request.data.get('password')
user_obj = models.User.objects.filter(username=username,password=password).first()
back_dic = {'code':200,'msg':'登录成功'}
if user_obj:
# 登录成功
import uuid
token = uuid.uuid4()
models.UserToken.objects.update_or_create(user=user_obj,defaults={'token':token})
back_dic['user'] = username
back_dic['token'] = token
else:
back_dic['msg'] = '账号或密码错误'
return Response(back_dic)
drf路由与认证的更多相关文章
- drf路由分发、解析/渲染模块配置、使用admin、自动序列化配置
目录 drf路由分发配置 解析模块配置 渲染模块配置 浏览器渲染打开 浏览器渲染关闭 结论 drf使用后台admin drf序列化模块 serializers.py: views.py:单查群查 测试 ...
- DRF内置认证组件之自定义认证系统
自定义token认证 我们知道,在django项目中不管路由以及对应的视图类是如何写的,都会走到 dispatch 方法,进行路由分发, 在阅读 APIView类中的dispatch 方法的源码中,有 ...
- DRF框架之认证组件用法(第四天)
1. 什么是drf 框架的认证组件: auth 就等于是jango中的Auth模块,Auth是自带session信息,但是 drf的认证组件可以自定义token携带过去,去判断用的 2.如何实现认证呢 ...
- drf框架中认证与权限工作原理及设置
0909自我总结 drf框架中认证与权限工作原理及设置 一.概述 1.认证 工作原理 返回None => 游客 返回user,auth => 登录用户 抛出异常 => 非法用户 前台 ...
- 【DRF框架】认证组件
DRF框架的认证组件 核心代码: self.perform_authentication(request) 框架自带模块: from rest_framework import a ...
- DRF的三大认证组件
目录 DRF的三大认证组件 认证组件 工作原理 实现 权限组件 工作原理 实现 频率组件 工作原理 实现 三种组件的配置 DRF的三大认证组件 认证组件 工作原理 首先,认证组件是基于BaseAuth ...
- DRF 版本和认证
Django Rest Framework 版本控制组件 DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~ 当我们 ...
- Restful API学习Day4 - DRF版本控制和认证
参考文档: Django REST framework基础:版本控制 Django REST framework基础:认证.权限.限制 为什么要有版本? 某些客户端 使用低版本只维护不开发新功能 v1 ...
- DRF 版本 及认证
版本控制 -- # 初始化我们的版本 version, scheme = self.determine_version(request, *args, **kwargs) request.v ...
随机推荐
- InstallShield 2015 Limited Edition 打包教程
InstallShield 2015 Limited Edition 打包教程 右键解决方案,新增项目,选择其他项目类型,安装和部署. InstallShield2015可以免费使用,但需要下载.安装 ...
- Python内置Turtle绘图库方法简介+多案例
urtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的 ...
- Python 报错:NameError: name 'ctypes' is not defined
使用python中的ctypes模块可以很方便的调用windows的dll(也包括linux下的so等文件) 引入ctypes库 有两种方法 from ctypes import * import c ...
- 解读Spring源码之前的准备
请忽略以下的文章,现在回过头来才发现学习源码不用如此复杂 1.IDEA 新建一个maven项目, 2.pom 中倒入 spring5 的基本包,然后利用maven 插件down下源码 3.然后就可以开 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(四)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- [转] Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
点击阅读原文 一.概述 通过 sysfs 方式控制 GPIO,先访问 /sys/class/gpio 目录,向 export 文件写入 GPIO 编号,使得该 GPIO 的操作接口从内核空间暴露到用户 ...
- [CQOI2007]矩形
题目 点这里看题目. 分析 插头 DP ,考虑枚举一下两块之间的分割线,本质上就是两个端点都在边界上的路径. DP 过程中,我们将没有端点在边界上面的路径称为 1 路径,反之叫 2 路径 ...
- @atcoder - CODE FESTIVAL 2017 Elimination Tournament Round 3 F@ Unicyclic Graph Counting
目录 @description@ @solution@ @accpeted code@ @details@ @description@ 求有多少 n 点 n 边的无向连通图,满足第 i 个点的度数为 ...
- Calender类——字段值介绍
今天,看到有人这样编写代码,有点不明所以: Calendar calendar = Calendar.getInstance(); calendar.get(1): calendar.get(2)+1 ...
- mysql HAVING用法
原文链接:https://www.cnblogs.com/mr-wuxiansheng/p/11188733.html having字句可以让我们筛选分组之后的各种数据,where字句在聚合前先筛选记 ...