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

文章目录

  • 一、路由组件
    • 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,includeurlpatterns = [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 SimpleRouterrouter = 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 ModelViewSetfrom rest_framework.response import Responsefrom rest_framework.decorators import actionclass 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 LoginAuthauthentication_classes = [test.LoginAuth, ]# 认证可以有多个,在调用_authenticate方法时会将列表里面类实例成对象,然后执行对象里面的authenticate方法。# 执行顺序从前至后,如果某个对象返回了正确结果则后面对象不会执行。'如果全局认证了但是又不想让某一个不认证,需要再视图类里面写入authenticate_classes = []清空即可'

登录认证类

	from rest_framework.authentication import BaseAuthenticationfrom . import modelsfrom rest_framework.exceptions import AuthenticationFailed'''通过认证类完成,使用步骤1 写一个认证类,继承BaseAuthentication2 重写authenticate方法,在内部做认证3 如果认证通过,返回2个值4 认证不通过抛AuthenticationFailed异常5 只要返回了两个值,在后续的request.user 就是当前登录用户'''class LoginAuth(BaseAuthentication):def authenticate(self, request):  重写authenticate方法,做内部认证# 完成对用户的校验# 当次请求的requesttoken = request.query_params.get('token')  获取tokenuser_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.mzph.cn/news/580352.shtml

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

相关文章

万界星空科技生产管理MES系统中的工时管理

工时管理的重大意义 1.提高生产效率 通过工时管理&#xff0c;企业可以更加精确地掌握研发人员的工时情况&#xff0c;及时调整项目进度和人力安排&#xff0c;提高生产效率。 2.降低人力成本 通过工时管理&#xff0c;企业可以更加精确地核算研发人员的工时费用&#xff0c…

玩客云 青龙面板

一、刷机 需要的工具&#xff0c;镊子&#xff0c;双公头USB&#xff08;可以自己做&#xff09;&#xff0c;U盘 青龙面板全教程 | Anubis的小窝 powersee教程 玩客云导航固件使用说明 安装教程 玩客云乱七八糟的坑 静态IP配置 玩客云第二版固件说明 docker 下载器 …

VScode跑通Remix.js官方的contact程序开发过程

目录 1 引言 2 安装并跑起来 3 设置根路由 4 用links来添加风格资源 ​5 联系人路由的UI 6 添加联系人的UI组件 7 嵌套路由和出口 8 类型推理 9 Loader里的URL参数 10 验证参数并抛出响应 书接上回&#xff0c;我们已经跑通了remix的quick start项目&#xff0c;接下…

【计算机毕业设计】SSM超市订单管理系统

项目介绍 超市订单管理系统。主要功能包括订单管理、供应商管理、用户管理等功能 环境需要 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐ID…

MSPM0L1306例程学习-ADC部分(5)

MSPM0L1306例程学习系列 使用的TI的官方例程&#xff0c;即SDK里边包含的例程代码。 可以到TI官网下载并且安装SDK: https://www.ti.com.cn/tool/cn/download/MSPM0-SDK/ MCU使用的是MSPM0L1306, 对于ADC部分&#xff0c;有10个例程&#xff1a; 今天接着讲2个例程&#xff0…

w16php系列之基础数组

一、索引数组 概念 索引数组 是指键名为整数的数组。默认情况下&#xff0c;索引数组的键名是从0开始&#xff0c;并依次递增。它主要适用于利用位置&#xff08;0、1、2……&#xff09;来标识数组元素的情况。另外&#xff0c;索引数组的键名也可以自己指定 示例代码 <…

系列十六(面试)、RocketMQ中如何解决消息堆积问题?

一、RocketMQ中解决消息堆积问题 1.1、概述 消息堆积是RocketMQ中很常见的一个问题&#xff0c;也是面试官很喜欢问的一个问题&#xff0c;那么什么是消息堆积呢&#xff1f;消息堆积&#xff0c;顾名思义是指某个时间段队列里面堆积了大量来不及消费的消息&#xff0c;一般认…

8_js_dom编程入门2

Objective&#xff08;本课目标&#xff09; 掌握基本课堂案例掌握节点的关系操作 1. 按钮选中案例 课堂案例&#xff1a;1.显示按钮的选中效果.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta nam…

Upload上传图片,回显图片,编辑图片,限制图片,不显示上传图标,图片放大功能

效果图&#xff1a; 新增、编辑时&#xff1a;限制上传四张&#xff0c;当超过四张隐藏上传图标 图片放大 &#xff1a;效果图 详情&#xff1a;回显时不显示上传图标 页面&#xff1a;template 部分 图片在前端存储&#xff0c;提交时一并给后端 :file-list"repairPlan…

什么是骨传导蓝牙耳机?骨传导耳机原理分析!

骨传导耳机&#xff0c;顾名思义是利用骨传导技术制造而成的一种耳机&#xff0c;也被称之为骨导耳机、骨感耳机、骨传感耳机。 骨传导耳机的传声原理跟传统耳机有所不同&#xff0c;传统耳机通过空气振动将声音传入耳膜&#xff0c;而骨传导耳机是通过人体骨骼将声音直接传递…

c4d怎么建模沙发?

c4d怎么建模沙发&#xff1f;c4d中想要制作一组沙发&#xff0c;该怎么制作三维立体的沙发模型呢&#xff1f;c4d中想要制作一组沙发&#xff0c;该怎么建模沙发呢&#xff1f;下面我们就来看看c4d创建沙发模型的教程。 1、打开软件&#xff0c;点击立方体&#xff1b; 2、修改…

vue2、vue3状态管理之vuex、pinia

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、状态管理之vuex1.1 State调用&#xff1a;1.2 Mutation在vuex中定义&#xff1a;在组件中使用&#xff1a; 1.3 Action在vuex中定义&#xff1a;将上面的减…

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

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

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

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

Everything 搜索

正则表达式Regex 首先需要开启 Everything 工具在&#xff08;字符串&#xff09;查找时&#xff0c;对正则表达式功能的支持&#xff1a; 需要在【菜单栏】⇒ 【Search】⇒ 勾选【Enable Regex】 查看Everything 支持的语法:

怎么下载landsat 8影像并在ArcGIS Pro中进行波段组合

Landsat 8&#xff08;前身为Landsat数据连续性任务&#xff0c;或 LDCM&#xff09;于2013年2月11日由 Atlas-V火箭从加利福尼亚州范登堡空军基地发射升空&#xff0c;这里为大家介绍一下该数据的下载的方法&#xff0c;希望能对你有所帮助。 注册账号 如果之前已经注册过的…

基于采样的自动驾驶规划算法 - PRM,RRT,RRT*,CL-RRT

本文将讲解PRM&#xff0c;RRT&#xff0c;RRT*自动驾驶规划算法原理&#xff0c;不正之处望读者指正 0 前言 机器人运动规划的基本任务&#xff1a;从开始位置到目标位置的运动 &#xff08;1&#xff09;如何躲避构型空间出现的障碍物 &#xff08;2&#xff09;如何满足机器…

SkyWalking UI 修改发布Nginx

文章目录 SkyWalking UI修改图标修改路由发布到Nginx添加认证修改路由模式vite.config.ts添加baseNginx配置 SkyWalking UI skywalking-booster-ui下载地址 修改图标 替换 logo.svg 修改路由 router - data - index.ts 发布到Nginx 添加认证 # 安装 yum install -y h…

VMware ESXi常用查看RAID和磁盘信息工具及命令汇总

一、Esxcli 使用 Esxcli 命令可获取有关 vSAN 的信息&#xff0c;以及对您的 vSAN 环境进行故障排除。 可用命令如下&#xff1a; 命令描述esxcli vsan network list确认哪些 VMkernel 适配器可用于 vSAN 通信。esxcli vsan storage list列出由 vSAN 声明的存储磁盘。esxcli…