DRF从入门到精通五(路由组件、认证组件)

news2024/11/18 9:25:05

文章目录

  • 一、路由组件
    • REST framework提供了两个router
    • action装饰器
  • 二、认证组件

一、路由组件

对于视图集ViewSetMixin,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息。

REST framework提供了两个router

  • SimpleRouter
  • DefaultRouter

也就是通过路由组件帮助我们自动生成路由,它会根据URL及请求匹配对应的视图方法,而这些方法则是来自视图集,如果我们需要自定义方法来处理请求的话,后续可以搭配action装饰器实现。

SimpleRouter为每个URL添加一个斜杠后缀,可以在初始化的时候提供trailing_slash参数,并设置为False

创建router对象,并注册视图集

	'导入'
	from rest_framework.routers import SimpleRouter,DefaultRouter
	'导入的模块不是继承就是实例化'
	router = SimpleRouter() 或者DefaultRouter()  # 创建对象
	'''
	DefaultRouter会生成一个根路径/的配置项
	DefaultRouter生成的每个配置项后都可以跟上.json,直接返回json数据
	还可以显示注册过的路由以及美化的页面
	SimpleRouter和DefaultRouter用法一致,功能几乎一样
	'''


	'注册路径,可以注册多个'
	router.register('publish',views.PublishView)  # 注册路由,并选择视图函数
	'注册:第一个参数是路径,第二个参数为视图类,第三个参数起别名用得少所有这里没用'
	
	urlpatterns = []
	
	
	'把生成的路由添加到urlpatterns路由列表中,有两种方式:'
	# 将生成的路由加入到Django需要调用的路由列表内
	'方式一:直接添加+='
		urlpatterns += router.urls
	'方式二:直接添加到urlpatterns里面使用include'
		from django.urls import path,include
		urlpatterns = [path('',include(router.urls))]
	

def register(self, prefix, viewset, basename=None):

注册参数说明:

  • prefix:路由的前缀
  • viewset:视图集(内部必须继承了ViewSetMixin类)
  • basename:路由的别名

上序代码会生成如下路由:

	path('publish/',views.PublishView.as_view()),
    path('publish/<int:pk>',views.PublishView.as_view()),

	''''
		^publish/$' [name='publish-list
		^publish/(?P<pk>[^/.]+)/$' [name='publish-detail']
	'''

每个路由对应的接口功能

	publish/:get请求的话则会执行视图集里面的list方法
	publish/:post请求的话则会执行视图集里面的create方法

	publish/<int:pk>/:get请求执行视图集里面的retrieve方法
	publish/<int:pk>/:put请求执行视图集里面的update方法
	publish/<int:pk>/:delete请求执行视图集里面的destroy方法

实际展示
视图类

	from rest_framework.viewsets import ModelViewSet
	'必须是继承了ViewSetMixin类的视图类才能使用这种自动生成路由的方法'
	class PublishView(ModelViewSet):
	    queryset = models.Publish.objects.all()
	    serializer_class = PublishSerializer

路由

	from rest_framework.routers import SimpleRouter
	router = SimpleRouter()
	router.register('publish',views.PublishView)
	urlpatterns = []
	urlpatterns += router.urls

此时上面代码就可以自动生成路由了,完成了增、删、改、查(一条或多条数据)的接口了,但是不包括在视图集里面自定义的方法。

如果要给我们自定义的方法也加上路由,那么则需要使用action装饰器来声明。


SimpleRouter生成URL的方式
在这里插入图片描述


DefaultRouter生成URL的方式
在这里插入图片描述


action装饰器

在视图集中,如果想要让Router自动帮助我们为自定义的方法生成路由信息,需要使用rest_framework.decorators.action装饰器。

使用action装饰器的方法名会作为路由的后缀,例如:

	/publish/使用action装饰器的方法名/

并且action装饰器会接收两个参数:

  • methods:声明该action对应的请求方式,列表传递:['get','post']表示该路由get请求与post请求。
  • detail:声明该action的路由是否与单一资源(就是单条数据)对应,如果需要的话设置True。
	/publish/<int:pk>/使用action装饰器的方法名/
	
	True:表示路径格式是:/publish/pk/action方法名/
	False:表示路径格式是:/publish/action方法名/
  • url_path:控制生成的/使用action装饰器的方法名/后面的路径是什么,如果不写默认以方法名
  • url_name:别名,用于反向解析

实际案例
视图类

	from rest_framework.viewsets import ModelViewSet
	from rest_framework.response import Response
	from rest_framework.decorators import action
	class PublishView(ModelViewSet):
	    queryset = models.Publish.objects.all()
	    serializer_class = PublishSerializer
	
	    @action(methods=['post'], detail=False)
	    def login(self,request):
	        return Response({'message':'登录成功'})
	
	    @action(methods=['get'],detail=True)
	    def test(self,request,pk):
	        return Response({'message':'测试成功'})

效果展示
在这里插入图片描述
在这里插入图片描述
此时可以从浏览器上看到自动生成的路由

	api/v1/ ^publish/$ [name='publish-list']
	api/v1/ ^publish/login/$ [name='publish-login']
	api/v1/ ^publish/(?P<pk>[^/.]+)/$ [name='publish-detail']
	api/v1/ ^publish/(?P<pk>[^/.]+)/test/$ [name='publish-test']

它使用的是正则来匹配,中间使用了有名分组,以关键字:pk=xx的形式传给视图。


二、认证组件

在DRF中,我们要进行登录认证的话需要使用DRF内部的认证组件,为什么不用auth组件?因为DRF重新封装了request方法,而当我们使用原来reqeust.user时,则会调用_authenticate方法,然后在调用我们编写的认证类里面的authenticate方法进行认证。

开启认证有两种方法:

  • 局部开启
  • 全局开启

全局开启方式:在settings.py文件里面进行DRF配置

	REST_FRAMEWORK={
	    "DEFAULT_AUTHENTICATION_CLASSES":["app01.auth.LoginAuth"]
	    # value值是我们认证组件类在当前项目的路径
	}

局部开启:在视图类里面指定认证类

	'导入登录认证类'
	from .auth import LoginAuth
	authentication_classes = [test.LoginAuth, ]
	# 认证可以有多个,在调用_authenticate方法时会将列表里面类实例成对象,然后执行对象里面的authenticate方法。
	# 执行顺序从前至后,如果某个对象返回了正确结果则后面对象不会执行。

	'如果全局认证了但是又不想让某一个不认证,需要再视图类里面写入authenticate_classes = []清空即可'

登录认证类

	from rest_framework.authentication import BaseAuthentication
	from . import models
	from rest_framework.exceptions import AuthenticationFailed
	'''
	通过认证类完成,使用步骤
		1 写一个认证类,继承BaseAuthentication
	    2 重写authenticate方法,在内部做认证
	    3 如果认证通过,返回2个值
	    4 认证不通过抛AuthenticationFailed异常
	    5 只要返回了两个值,在后续的request.user 就是当前登录用户
	'''
	
	class LoginAuth(BaseAuthentication):
	    def authenticate(self, request):  重写authenticate方法,做内部认证
	        # 完成对用户的校验
	        # 当次请求的request
	        token = request.query_params.get('token')  获取token
	        user_token = models.UserToken.objects.filter(token=token).first()
	        if user_token:
	            user = user_token.user  # 如果通过认证返回两个值,不通过则抛异常
	            return user,user_token
				'质押返回了两个值,在后续的request.user就是当前登录用户'
	        else:
	            raise AuthenticationFailed('token不存在!')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1338496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EasyExcel实现动态表头(注解实现)

要实现上述动态头&#xff0c;按每日统计&#xff0c;每月统计&#xff0c;每年统计。而时间是一直变化&#xff0c;所以我们需要表头也一直动态生成。 首先&#xff0c;我们需要定义所需要实体类 public class CountDayData {ExcelProperty(value "业务员姓名")p…

electron 菜单栏打开指定url页面菜单实现方法

electron 菜单栏打开指定url页面菜单 可以是本地URL也可以是远程的URL 自动判断跳转 以下代码可以在主进程main.js里面也可以是在独立的模块文件里面 const { BrowserWindow } require(electron);//定义窗口加载URL export const winURL process.env.NODE_ENV development …

NativePHP:使用 PHP 构建桌面应用程序

PHP 在我心中占据着特殊的位置。它是我的第一份工作&#xff0c;我记得我在家里花了无数个小时做一些小项目。我非常想用 PHP 创建桌面应用程序&#xff0c;但我从来没有做到过。 现在&#xff0c;感谢 NativePHP&#xff0c;我可以了。 NativePHP 追随 Slack、Discord 和 Tre…

Ubuntu 20.04使用Livox Mid-360

参考文章&#xff1a; Ubuntu 20.04使用Livox mid 360 测试 FAST_LIO-CSDN博客 一&#xff1a;Livox mid 360驱动安装与测试 前言&#xff1a; Livox mid360需要使用Livox-SDK2&#xff0c;而非Livox-SDK&#xff0c;以及对应的livox_ros_driver2 。并需要修改FAST_LIO中部…

开集目标检测-标签提示目标检测大模型(吊打YOLO系列-自动化检测标注)

背景 大多数现有的对象检测模型都经过训练来识别一组有限的预先确定的类别。将新类添加到可识别对象列表中需要收集和标记新数据&#xff0c;并从头开始重新训练模型&#xff0c;这是一个耗时且昂贵的过程。该大模型的目标是开发一个强大的系统来检测由人类语言输入指定的任意…

【目标跟踪】解决多目标跟踪遮挡问题

文章目录 前言一、判定遮挡目标二、扩展目标框三、结论 前言 目标跟踪在发生遮挡时&#xff0c;极其容易发生Id Switch。网上许多算法忽视跟踪遮挡问题,同时网上相关资料也很少。博主为了解决跟踪遮挡&#xff0c;翻阅大量论文。分享其中一篇论文。论文链接&#xff1a;https:…

部署YUM软件仓库

借助于YUM软件仓库.可以完成安装、卸载、自动升级rpm软件包等任务&#xff0c;能够自动查找并解 决rpm包之间的依赖关系&#xff0c;而无须管理员逐个.手工地去安装每个rpm包&#xff0c;使管理员在维护大量Linux 服务器时更加轻松自如。.特别是在拥有大量Linux主机的本地网络中…

PYTHON入门级游戏开发:宇宙飞船游戏两万字详析

手讲解超详细python入门游戏项目‘打外星飞船’手把&#xff08;一&#xff09; 由于内容比较多&#xff0c;这里会分为五篇文章来讲解&#xff0c;从页面的创建、飞船控制、射击、外星人创建、射杀外星人五片来展开。 做一个窗口和设置响应用户 import sysimport pygame&qu…

Android 13 - Media框架(28)- ACodec(五)

前面几节我们了解了OMXNodeInstance是如何处理setPortMode、allocateBuffer、useBuffer的&#xff0c;这一节我们再回到ACodec&#xff0c;来看看 ACodec start 的其他部分。 我们首先来回顾一下&#xff0c;ACodec start 的状态切换以及处理的事务&#xff0c;我们用一张不太准…

23、Qt使用fftw3.3.5

一、下载 FFTW Installation on Windows 二、使用fftw 新建一个Qt项目&#xff0c;把“fftw3.h”和“libfftw3-3.dll”两个文件拷贝到项目目录下 在.pro中添加如下代码 LIBS -L$$PWD/ -llibfftw3-3 右击项目名称&#xff0c;选择“添加现有文件”&#xff0c;选择“fftw3.h…

【Echarts】使用echarts和echarts-wordcloud生成词云图

一、下载echarts和echarts-wordcloud 地址&#xff1a;https://download.csdn.net/download/qq_25285531/88663006 可直接下载放在项目中使用 二、词云数据 词云数据是对象的格式&#xff0c;可以从后端获取&#xff0c;这里以下面数据为例 $list3 array(array(name >…

《当初恋撞上人生》

《当初恋撞上人生》是很久以前起早的一个作品&#xff0c;然而断断续续、伤伤感感一直没写下去&#xff0c;最近打开看了一下&#xff0c;总算概述还完整&#xff0c;暂且贴出来也好。不想哪天一改&#xff0c;失了原本初心与色彩。 简章如下&#xff1a; 《初恋撞上人生》简述…

视频批量转码:一键转换多个视频mp4格式到FLV视频

在数字媒体时代&#xff0c;视频格式的多样性给处理工作带来了诸多不便。满足不同的播放需求&#xff0c;经常要视频从一种格式转换为另一种格式。其中&#xff0c;将mp4格式转换为FLV格式的需求很常见。现在一起来看下云炫AI智剪如何高效的将视频批量转码方法&#xff0c;一键…

CSS 文字弹跳效果

鼠标移过去 会加快速度 <template><div class"bounce"><p class"text" :style"{animationDuration: animationDuration}">欢迎使用UniApp Vue3&#xff01;</p></div> </template><script> export d…

运动轨迹仿真

重型运载火箭轨迹/总体参数一体化优化方法 硬核推导火箭运动方程&#xff0c;并用python仿真实现 rocket-simulation:MATLAB-火箭仿真软件 MatRockSim:Matlab 火箭飞行模拟器 【开源】飞鹰一号探空火箭——箭体设计、制造回顾与仿真对比 偏航角&#xff0c;滚动角&#xf…

HOJ 项目部署-前端定制 默认勾选显示标签、 在线编辑器主题和字号大小修改、增加一言功能 题目AC后礼花绽放

# 项目拉取地址&#xff1a; https://gitee.com/himitzh0730/hoj.git # 切换到hoj-vue目录执行以下命令 #安装依赖 npm install #运行服务 npm run serve #修改代码后构建项目到dist文件夹&#xff0c;到服务器docker-compose.yml中修改hoj-frontend文件映射即可 npm run build…

FPGA-AMBA协议、APB协议、AHB规范、AXI4协议规范概述及它们之间的关系

FPGA-AMBA协议、APB协议、AHB协议、AXI&#xff14;协议规范概述 笔记记录&#xff0c;AMBA协议、APB协议、AHB规范、AXI&#xff14;协议规范概述&#xff0c;只是概述描述&#xff0c;具体详细的协议地址传输、数据传输等内容将在下一章节详细说明。 文章目录 FPGA-AMBA协议…

自动化测试工程师怎样能规划好自己的职业生涯?

确定职业目标&#xff1a;首先&#xff0c;自动化测试工程师需要明确自己的职业目标&#xff0c;是希望在测试领域深入发展&#xff0c;还是希望向其他方向转型。如果希望在测试领域深入发展&#xff0c;可以专注于自动化测试技术的不断提升&#xff0c;以及测试管理的相关技能…

python3下载手机安卓版,python下载手机版最新

大家好&#xff0c;小编为大家解答python3下载手机安卓版的问题。很多人还不知道python下载手机版最新&#xff0c;现在让我们一起来看看吧&#xff01; 1、先去python官网下载python3的源码包&#xff0c;网址&#xff1a;https://www.python.org/ 1)进去之后点击导航栏的Down…

生成超清分辨率视频,南洋理工开源Upscale-A-Video

大模型在生成高质量图像方面表现出色,但在生成视频任务中&#xff0c;经常会面临视频不连贯、图像模糊、掉帧等问题。 这主要是因为生成式抽样过程中的随机性,会在视频序列中引入无法预测的帧跳动。同时现有方法仅考虑了局部视频片段的时空一致性,无法保证整个长视频的整体连贯…